由于在开发中,遇到一个复杂的表格开发需求,后端返回的数据是多条的,但是前端的表格中需要根据相同的行(row)中具体的列(col)的数据一致,来合并具体的单元格。效果如下图。
那么一个具体的思路是:
- 先获取table的一个dom节点
- 然后获取table的rows行
- 根据rows行遍历,然后遍历需要合并的列(col)
- 如果当前行的具体列的数据和下一行的具体列的数据一致,那么下一行的具体列加上一个移除标识,方便后期移除
- 然后递归遍历是否含有这个标识,如果有就重新递归,没有就rowSpan+1
// table的id 需要合并的列(从0开始算)
function mergeCell(tableId, cols) {
var table = document.getElementById('my-table');
var table_rows = table.rows;
// 需要合并的列的数组
cols.forEach((v, k) => {
// 循环table每一行
for (let i = 0; i < table_rows.length - 1; i++) {
// row
let now_row = table_rows[i];
let next_row = table_rows[i + 1];
// col
let now_col = now_row.cells[v];
let next_col = next_row.cells[v];
if (now_col.innerHTML == next_col.innerHTML) {
// 标记为需要删除
$(next_col).addClass('remove');
// 递归判断当前对象时候已经被删除
setParentSpan(table, i, v);
}
}
})
$(".remove").remove();
}
// (递归方法,用于多行统计) pram => table表格 当前行 对应的列
function setParentSpan(table, row, col) {
var col_item = table.rows[row].cells[col];
if ($(col_item).hasClass('remove')) {
setParentSpan(table, --row, col)
} else {
col_item.rowSpan += 1;
}
}
// 合并单元格(合并第0 1 2 3 4 8)列
mergeCell('my-table', [0, 1,2,3,4,8]);