JS合併相同單元格
阿新 • • 發佈:2018-12-10
實現思路:
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**