迭代表格单元格,重新使用行跨度值

Cod*_*rer 4 html javascript html-table

我有一个简单的 HTML 表,它在一些随机列中使用行跨度。一个例子可能看起来像

 A | B |
---|---| C
 D |   |
---| E |---
 F |   | G
Run Code Online (Sandbox Code Playgroud)

我想迭代这些行,以便将行视为A,B,C, D,E,C, then F,E,G。

我想我可能可以拼凑一些非常复杂的东西来cell.index()检查后面的行中的“丢失”列,但我想要一些更优雅的东西......

cau*_*aub 5

没有jquery:

function tableToMatrix(table) {
  var M = [];
  for (var i = 0; i < table.rows.length; i++) {
    var tr = table.rows[i];
    M[i] = [];
    for (var j = 0, k = 0; j < M[0].length || k < tr.cells.length;) {
      var c = (M[i-1]||[])[j];
      // first check if there's a continuing cell above with rowSpan
      if (c && c.parentNode.rowIndex + c.rowSpan > i) {
        M[i].push(...Array.from({length: c.colSpan}, () => c))
        j += c.colSpan;
      } else if (tr.cells[k]) {
        var td = tr.cells[k++];
        M[i].push(...Array.from({length: td.colSpan}, () => td));
        j += td.colSpan;
      }
    }
  }
  return M;
}

var M = tableToMatrix(document.querySelector('table'));

console.table(M.map(r => r.map(c => c.innerText)));

var pre = document.createElement('pre');
pre.innerText = M.map(row => row.map(c => c.innerText).join('\t')).join('\n');
document.body.append(pre);
Run Code Online (Sandbox Code Playgroud)
td {
  border: 1px solid rgba(0,0,0,.3);
}
Run Code Online (Sandbox Code Playgroud)
<table>
  <tr>
    <td colspan=2>A</td>

    <td rowspan=2>B</td>
  </tr>
  <tr>
    <td>C</td>
    <td rowspan=3>D</td>
  </tr>
  <tr>
    <td rowspan=2>E</td>
    <td rowspan=4>F</td>
  </tr>
  <tr></tr>
  <tr>
    <td rowspan=2 colspan=2>G</td>
  </tr>
  <tr></tr>
  <tr>
    <td rowspan=3 colspan=3>H</td>
  </tr>
  <tr></tr>
  <tr></tr>
  <tr>
    <td colspan=3>I</td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)