1. 程式人生 > >JS合併相同單元格

JS合併相同單元格

實現思路:
1、找出需要合併的列(col)
2、遍歷table中的每一行(tr)。結合列數(col)。進行遍歷每一行的tr
3、判斷當前tr和下一行的tr是否相同,如果相同,那麼為下一行的tr新增一個class。方便後續刪除
4、為當前重複的第一項tr新增rowspan屬性
5、刪除帶有標記的tr

以下是完整的JS程式碼


  // table的id  需要合併的列(從0開始算)
  function mergeCell(tableId, cols) {
    var table = document.getElementById(tableId);
    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;
    }
  }

  // 合併單元格(合併第1、2、3、6、7、8)列
   mergeCell('order_table', [0, 1]);

html則為普通的tr td表格(略)

為什麼會有一個遞迴方法?

假設現在有3行的資料是相同的,即需要合併單元格

步驟1:遍歷第一行,發現與第二行的資料相同,第二行資料被標記刪除,第一行的rowspan+1

步驟2:遍歷第二行,發現第二行資料和第三行資料相同,第三行資料被標記需要刪除,與此同時,第二行的rowspan+1

那麼等到刪除資料的時候,其實第二行已經被刪除。rowspan並不起作用,我們在遍歷第二行的時候的rowspan其實需要加到第一行上(即沒有被標記的行)。

那麼就需要向上遍歷。直到找到沒有被標記的行進行rowspan+1。

所以就有了現在的遞迴方法


合併前:
在這裡插入圖片描述

合併後:
在這裡插入圖片描述

因為我在JS中,只控制了合併第1和2行。因為陣列是從0開始的,所以在方法中傳入的陣列是[0,1]

合併單元格的JS就到這裡了


**THE END**