layui表格数据合并行单元格

效果图:
相邻数据之间比较合并,不同的重新开始比较
数据要求:
相邻数据之间比较合并,不同的重新开始比较

var demoTable = table.render({
                elem: '#demoList',
                cols: [[
                    {field: 'name', title: '名称', align: 'center'},
                    {field: 'year', title: '年份', align: 'center', sort: true},
                    {field: 'price', title: '单价', align: 'center', sort: true},
                    {field: 'num', title: '数量', align: 'center', sort: true},
                    {field: 'state', title: '状态', templet: '#stateTpl', align: 'center'},
                    {field: 'dataState', title: '失效标识', templet: '#dataStateTpl', align: 'center'},
                    // {align: 'center', toolbar: '#demoListBar', title: '操作'}
                ]],
                page: true,
                data: datas,
                done: function (res, curr, count) {
                    merge(res);
                },
                height: 'full-80'
            });
//实现逻辑,由默认行(要合并的行为 0 行)进行 rowspan 设置;
            //比较数据,需要合并的项相同,则nextMergeIndex+1;mark+1;
            //例如为 2 则向下合并2个单元格,同时,行数为 1 的行  $(this).css("display", "none"); 隐藏
            //但需要合并的列数值不一样,说明是新的不能合并一条数据,mergeIndex 变为 nextMergeIndex;nextMergeIndex+1,mark=1,重新开始
            function merge(res) {
                var data = res.data;
                var mergeIndex = 0; //需要进行合并的初始行数
                var nextMergeIndex = 1; //进行比较的那一行
                var mark = 1; //mark是计算每次需要合并的格子数
                var flag = true;//每一次重新开始比较的标识
                var columsName = ['name', 'year', 'price', 'state', 'dataState'];//需要合并的列名称
                var columsIndex = [0, 1, 2, 4, 5];//需要合并的列索引值
                var trArr = $("[lay-id='demoList'] .layui-table-body>.layui-table").find("tr"); //所有行,有多个表格存在时,必须指定lay-id
                do {
                    var markFlag = true;//是否进行判断合并
                    do {//循环判断是否可以合并,只有不能合并时才跳出
                        for (var k = 0; k < columsName.length; k++) {
                            if (data[mergeIndex][columsName[k]] === data[nextMergeIndex][columsName[k]]) { //后一行的值与前一行的值做比较,相同就需要合并
                                markFlag = true;
                            } else {
                                markFlag = false;
                                break;
                            }
                        }
                        if (markFlag) {
                            mark += 1;//需要覆盖的行数加1
                            nextMergeIndex += 1;//比较的行数加1
                            //判断是否到最后一条数据
                            if (nextMergeIndex >= data.length) {
                                markFlag = false;
                            } else {
                                markFlag = true;
                            }
                        }
                    } while (markFlag);
                    if (mark > 1){//只有存在合并操作时才合并
                        for (var j = 0; j < columsIndex.length; j++) { //这里循环所有要合并的列
                            var tdPreArr = trArr.eq(mergeIndex).find("td").eq(columsIndex[j]); //获取默认行的列
                            tdPreArr.each(function () { //相同列的第一列增加rowspan属性
                                $(this).attr("rowspan", mark);//合并等于 mark 数值的行
                            });
                            //存在多条要隐藏的行单元格,每条都要隐藏
                            for (var x = mergeIndex+1; x < nextMergeIndex; x++) { //这里循环所有要隐藏的列
                                var tdCurArr = trArr.eq(x).find("td").eq(columsIndex[j]); //获取下一行的当前列
                                tdCurArr.each(function () { //当前行隐藏
                                    $(this).css("display", "none");
                                });
                            }
                        }
                    }
                    mergeIndex = nextMergeIndex;
                    mark = 1;
                    nextMergeIndex += 1;
                    if (nextMergeIndex <= data.length) {
                        flag = true;
                    } else {
                        flag = false;
                    }
                } while (flag);
            }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值