由于在开发中,遇到一个复杂的表格开发需求,后端返回的数据是多条的,但是前端的表格中需要根据相同的行(row)中具体的列(col)的数据一致,来合并具体的单元格。效果如下图。
    image.png
    那么一个具体的思路是:

    • 先获取table的一个dom节点
    • 然后获取table的rows行
    • 根据rows行遍历,然后遍历需要合并的列(col)
    • 如果当前行的具体列的数据和下一行的具体列的数据一致,那么下一行的具体列加上一个移除标识,方便后期移除
    • 然后递归遍历是否含有这个标识,如果有就重新递归,没有就rowSpan+1
    1. // table的id 需要合并的列(从0开始算)
    2. function mergeCell(tableId, cols) {
    3. var table = document.getElementById('my-table');
    4. var table_rows = table.rows;
    5. // 需要合并的列的数组
    6. cols.forEach((v, k) => {
    7. // 循环table每一行
    8. for (let i = 0; i < table_rows.length - 1; i++) {
    9. // row
    10. let now_row = table_rows[i];
    11. let next_row = table_rows[i + 1];
    12. // col
    13. let now_col = now_row.cells[v];
    14. let next_col = next_row.cells[v];
    15. if (now_col.innerHTML == next_col.innerHTML) {
    16. // 标记为需要删除
    17. $(next_col).addClass('remove');
    18. // 递归判断当前对象时候已经被删除
    19. setParentSpan(table, i, v);
    20. }
    21. }
    22. })
    23. $(".remove").remove();
    24. }
    25. // (递归方法,用于多行统计) pram => table表格 当前行 对应的列
    26. function setParentSpan(table, row, col) {
    27. var col_item = table.rows[row].cells[col];
    28. if ($(col_item).hasClass('remove')) {
    29. setParentSpan(table, --row, col)
    30. } else {
    31. col_item.rowSpan += 1;
    32. }
    33. }
    34. // 合并单元格(合并第0 1 2 3 4 8)列
    35. mergeCell('my-table', [0, 1,2,3,4,8]);