【发布时间】:2019-10-28 10:27:45
【问题描述】:
我已经为此苦苦挣扎了一段时间。我有一个根据一些 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>
这根本不是我想要的,但我觉得我真的很接近了!它试图计算下面一个具有相同值的(第一列)单元格的数量,将此数字分配给最后一个相关单元格的行跨度,然后删除后续单元格,然后再循环返回以捕获其余单元格。我希望我的最终代码是这个的变体,所以有人可以告诉我我哪里出错了吗?非常感谢!
【问题讨论】:
-
请与预期的表行分享示例场景
-
@NagaSaiA 谢谢 - 好点,现在添加到问题中(jsfiddle.net/5rdw6v4h)
-
可能的旁注:那时你可能希望那些是
<th>s(至少在简单示例中的上下文 - 我可能错了。)。
标签: javascript html html-table merge