gpt4 book ai didi

javascript - 使用JS合并具有相同值的相邻HTML表格单元格

转载 作者:行者123 更新时间:2023-12-05 00:28:30 28 4
gpt4 key购买 nike

我一直在努力解决这个问题。我有一个根据一些 JSON 数据自动生成的表,这些数据可能会有所不同。我想合并第一列中具有相同值的相邻单元格,例如此表中的“鱼”和“鸟”:

<table>
<tr>
<td>fish</td>
<td>salmon</td>
</tr>
<tr>
<td>fish</td>
<td>cod</td>
</tr>
<tr>
<td>fish</td>
<td>plaice</td>
</tr>
<tr>
<td>bird</td>
<td>robin</td>
</tr>
<tr>
<td>bird</td>
<td>crow</td>
</tr>
</table>

我不想理想地使用任何库,只是纯 JS。

这就是我希望它看起来的样子:

table, tr, td {
border: solid 1px black;
}
<table>
<tr>
<td rowspan="3">fish</td>
<td>salmon</td>
</tr>
<tr>
<td>cod</td>
</tr>
<tr>
<td>plaice</td>
</tr>
<tr>
<td rowspan="2">bird</td>
<td>robin</td>
</tr>
<tr>
<td>crow</td>
</tr>
</table>


我一直在寻找不同的方法来识别不同的值及其频率,然后将行跨度更改为正确的数字,然后删除其他单元格,但这些都在不同的用例中崩溃了。

这是我到目前为止所拥有的:

let table = document.querySelector('table');
let rowCount = 1;

for (let i = 0; i < (table.rows.length - 1); i++) {
if (table.rows[i].cells[0].innerHTML === table.rows[i + 1].cells[0].innerHTML) {
rowCount++;
} else if (rowCount !== 1) {
table.rows[i].cells[0].setAttribute('rowspan', rowCount);
for (let j = (i - rowCount + 1); j < rowCount; j++) {
table.rows[j].cells[0].remove();
};
rowCount = 1;
};
};
table, tr, td {
border: solid 1px black;
}
<table>
<tr>
<td>fish</td>
<td>salmon</td>
</tr>
<tr>
<td>fish</td>
<td>cod</td>
</tr>
<tr>
<td>fish</td>
<td>plaice</td>
</tr>
<tr>
<td>bird</td>
<td>robin</td>
</tr>
<tr>
<td>bird</td>
<td>crow</td>
</tr>
</table>


这根本不是我想要的,但我觉得我真的很接近了!它试图计算下面一个具有相同值的(第一列)单元格的数量,将此数字分配给最后一个相关单元格的行跨度,然后删除后续单元格,然后再循环返回以捕获其余单元格。我希望我的最终代码是这个的变体,所以有人可以告诉我我哪里出错了吗?非常感谢!

最佳答案

你确实很接近!

一种相当简化的方法是保留对当前“标题”单元格的引用,即要增加 rowspan 的单元格。的。这样你就不必处理索引,产生一个非常简单的算法:

  • 对于每一行
  • 将 firstCell 设置为行的第一个单元格
  • 如果这是第一行或 firstCell 的文本与 headerCell 的文本不同
  • 将 headerCell 设置为 firstCell
  • 否则
  • 将 headerCell 的 rowSpan 增加 1
  • 删除 firstCell

  • 在 JavaScript 中,它看起来像这样:

    const table = document.querySelector('table');

    let headerCell = null;

    for (let row of table.rows) {
    const firstCell = row.cells[0];

    if (headerCell === null || firstCell.innerText !== headerCell.innerText) {
    headerCell = firstCell;
    } else {
    headerCell.rowSpan++;
    firstCell.remove();
    }
    }
    table, tr, td {
    border: solid 1px black;
    }
    <table>
    <tr>
    <td>fish</td>
    <td>salmon</td>
    </tr>
    <tr>
    <td>fish</td>
    <td>cod</td>
    </tr>
    <tr>
    <td>fish</td>
    <td>plaice</td>
    </tr>
    <tr>
    <td>bird</td>
    <td>robin</td>
    </tr>
    <tr>
    <td>bird</td>
    <td>crow</td>
    </tr>
    </table>

    关于javascript - 使用JS合并具有相同值的相邻HTML表格单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587070/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com