效果图:
数据要求:
相邻数据之间比较合并,不同的重新开始比较
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);
}