锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. jquery 合并任意值相等的列单元格

jquery 合并任意值相等的列单元格

0
  • 软件开发
  • 发布于 2024-09-26
  • 0 次阅读
黄健
黄健

今天在开发中遇到产品要把数据相同的表格合并到一起,在经过一番周折以后就实现了。现在把实现的代码做一下记录并分享!

<body>
    <ul class="nav nav-tabs">
        <li class="active"><a href="${ctx}/activity/IncomeData/">收入数据查询</a></li>
    </ul>
    <form:form id="searchForm" modelAttribute="IncomeData" action="${ctx}/activity/IncomeData/" method="get" class="breadcrumb form-search">
        <ul class="ul-form">
            <li><label>编号:</label>
                <form:input path="activityNo" htmlEscape="false" maxlength="16" class="input-medium"/>
            </li>
            <li><label>时间:</label>
                <input name="beginTime" type="text" readonly="readonly" maxlength="20" class="input-medium Wdate"
                    value="<fmt:formatDate value="${IncomeData.beginTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"
                    onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});"/>
            </li>
            <li><label>到:</label>
                <input name="endTime" type="text" readonly="readonly" maxlength="20" class="input-medium Wdate"
                       value="<fmt:formatDate value="${IncomeData.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"
                       onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});"/>
            </li>
            <li class="btns"><input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/></li>
            <li class="clearfix"></li>
        </ul>
    </form:form>
    <sys:message content="${message}"/>
    <table id="contentTable" class="table table-striped table-bordered table-condensed">
        <thead>
            <tr>
                <th>编号</th>
                <th>日期</th>
                <th>人数</th>
                <th>付费人数</th>
                <th>总金额</th>
                <th>豪华大礼编号</th>
                <th>豪华大礼单价</th>
                <th>销售数量</th>
                <th>销售金额</th>
            </tr>
        </thead>
        <tbody>
        <c:forEach items="${page.list}" var="IncomeData">
            <tr>
                <td>
                    ${IncomeData.no}
                </td>
                <td>
                    ${IncomeData.date}
                </td>
                <td>
                    ${IncomeData.lookCount}
                </td>
                <td>
                    ${IncomeData.payCount}
                </td>
                <td>
                    ${IncomeData.totalFee}
                </td>
                <td>
                                       ${IncomeData.packageNum}
                </td>
                <td>
                    ${IncomeData.price}
                </td>
                <td>
                    ${IncomeData.soldNum}
                </td>
                <td>
                    ${IncomeData.soldFee}
                </td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
</body>

一、只合并第一列

<script type="text/javascript">

        $(document).ready(function() {
            mergeTimeCell();

        });

                //合并单元格
        function mergeTimeCell(){
            var sameDayArr=[];
            var timeArr=[];
            var itemArr=[];
            var countArr=[];
            var count = 0;
            $("tbody").find("tr").each(function(index,item){
                var time = $(item).children(":eq(0)").text().trim()
                timeArr.push(time)
            })
            //判断和最后一个tr相同的个数
            var lastItemArr =[]
            var last =timeArr[timeArr.length-1]
            for(var i = 0;i<timeArr.length;i++){
                if(last==timeArr[i]){
                    lastItemArr.push(timeArr[i])
                }
            }
            $("tbody").find("tr").each(function(index,item){
                var time = $(item).children(":eq(0)").text().trim()
                if(sameDayArr.indexOf(time)==-1){
                    sameDayArr.push(time)
                    countArr.push(count+1)
                    itemArr.push(item)
                    count=0
                }else{
                    count++
                    $(item).find("td:eq(0)").remove()
                }
            })
            countArr.push(lastItemArr.length)
            for(var i = 0;i<itemArr.length;i++){
                $(itemArr[i]).find("td:eq(0)").attr("rowspan",countArr[i+1])
            }
        }


</script>

二、合并多列单元格

<script type="text/javascript">

       $(document).ready(function() {
        //要合并哪些列(合并多列,列从大到小排列)
        var arr =[4,3,2,1,0];
        mergeRowCell("contentTable",1,0,arr);

    });

              /*
                  MergeTableCell("tableId", 1, 0, 1);
          param:tableId,table标签的id
          param:startRow,开始行的索引值
          param:endRow,结束行的索引值
          param:arr,需要处理的列的索引值[这是一个数组]
           */
        function mergeRowCell(tableId, startRow, endRow, arr) {
            for (var i = 0; i < arr.length; i++) {
                MergeTableCell(tableId, startRow, endRow, arr[i]);
            }
        }

        /*
                   MergeTableCell("tableId", 1, 0, 1);
           param:tableId,table标签的id
           param:startRow,开始行的索引值
           param:endRow,结束行的索引值
           param:col,需要处理的列的索引值
             */
        function MergeTableCell(tableId, startRow, endRow, col) {
            var tb = document.getElementById(tableId);
            //设置为0时,检索所有行
            if (endRow == 0) {
                endRow = tb.rows.length - 1;
            }
            //指定数据行索引大于表格行数
            if (endRow >= tb.rows.length) {
                return;
            }
            //检测指定的列索引是否超出表格列数
            if (col >= tb.rows[0].cells.length) {
                return;
            }
            //循环需要判断的数据行
            for (var i = startRow; i < endRow; i++) {
                //如果当前行与下一行数据值相同,则进行前面列的判断
                if (tb.rows[startRow].cells[col].innerHTML == tb.rows[i + 1].cells[col].innerHTML) {
                    var Same = true;
                    //循环跟前面的所有的同级数据行进行判断
                    for (var j = col; j > 0; j--) {
                        if (tb.rows[startRow].cells[j - 1].innerHTML != tb.rows[i + 1].cells[j - 1].innerHTML) {
                            Same = false;
                            break;
                        }
                    }
                    //如果前面的同级数据行的值均相同,则进行单元格的合并
                    if (true == Same) {
                        //如果相同则删除下一行的第0列单元格
                        tb.rows[i + 1].cells[col].style.display = 'none';
                        //更新rowSpan属性
                        tb.rows[startRow].cells[col].rowSpan = (tb.rows[startRow].cells[col].rowSpan | 0) + 1;
                    } else {
                        //增加起始行
                        startRow = i + 1;
                    }
                } else {
                    //增加起始行
                    startRow = i + 1;
                }
            }
        }

</script>

原文链接: https://onlyou.blog.csdn.net//article/details/105839992

标签: #前端 145
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.