本后端菜狗想在网上找合并单元格的代码,结果找到的都是太老的代码,然后就只能用Js手写了两种方法(第二种方法叫了个前端大佬写的)
废话不多说,直接上代码: (由于时间有点小久,就不写思路和过程啦)
第一种方法:
1.使用map扫描一遍表格,统计相同的信息数量(需要合并的个数),并标记每个重复的第一个元素
2.利用queue队列再扫描一遍表格,将不是第一个元素放入其中,最后讲队列元素全部出栈并删除元素。(这里不能用array数组存储删除的元素,因为删除会导致引用的下标不对)
3.扫描一遍表格,将第一个元素合并即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- <link href="/asserts/css/bootstrap.min.css" rel="stylesheet"> -->
<!-- Custom styles for this template -->
<!-- <link href="/asserts/css/dashboard.css" rel="stylesheet"> -->
</head>
<body>
<table class="table table-striped table-sm">
<thead>
<tr>
<th>交叉路口名称</th>
<th>道路名称</th>
<th>顺序</th>
<th>路宽</th>
<th>车道类型</th>
<th>车道方向</th>
<th> 操作</th>
</tr>
</thead>
<tbody>
<tr class="order">
<!-- <td rowspan="2" class="f1">环城南一路与骖鸾路交叉口</td> -->
<td class="f1">环城南一路与骖鸾路交叉口</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口1</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口1</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1">环城南一路与骖鸾路交叉口2</td>
<td class="f1">兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
</tbody>
</table>
<script>
setTimeout(function() {
//初值
var arr = document.getElementsByClassName("order");
var arr1 = document.getElementsByClassName("f1");
var queue1 = new Array();
var map = new Map();
//统计
for (var i = 0; i < arr1.length; i++) {
if (map.get(arr1[i].textContent) === undefined) {
arr1[i].classList.add("first")
map.set(arr1[i].textContent, 1); // 统计跨行的有多少,用一个 map 装着
} else map.set(arr1[i].textContent, map.get(arr1[i].textContent) + 1);
}
for (let [key, value] of map) {
console.log(key + " = " + value);
}
//删除
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] === undefined) continue;
if (!arr1[i].className.includes("first")) {
queue1.push(arr1[i]);
}
}
console.log(queue1);
while (queue1.length != 0) {
var a = queue1.pop();
a.remove();
console.log(a);
}
// 合并
for (var i = 0; i < arr.length; i++) {
if (arr1[i] === undefined) continue;
if (arr1[i].className.includes("first")) {
arr1[i].setAttribute('rowspan', map.get(arr1[i].textContent));
console.log(arr1[i].textContent + "合并");
}
}
}, 0);
</script>
</body>
</html>
结果:
第二种方法: 大佬写的就是不一样,一个For解决
1.扫描一遍表格,没有在arr数组找到的新元素就放入arr数组,如果在arr数组里找到了重复的元素,就把他隐藏掉,然后给第一个元素合并数+1即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
table {
margin: 100px auto;
border: 1px solid black;
border-spacing: 0
}
td {
border: 1px solid black;
border-collapse: collpase;
}
</style>
</head>
<body>
<table class="table table-striped table-sm">
<thead>
<tr>
<th colspan="3">交叉路口名称</th>
<th>道路名称</th>
<th>顺序</th>
<th>路宽</th>
<th>车道类型</th>
<th>车道方向</th>
<th> 操作</th>
</tr>
</thead>
<tbody>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口1</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口1</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口2</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口2</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口2</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
<tr class="order">
<td class="f1" colspan="3">环城南一路与骖鸾路交叉口2</td>
<td>兴和路</td>
<td>西南到东北</td>
<td>3.596</td>
<td>机动车道</td>
<td>出口道</td>
</tr>
</tbody>
</table>
<script>
//利用去重原理
var arr = [];
var f1 = document.getElementsByClassName("f1");
for (let i = 0; i < f1.length; i++) {
if (arr.indexOf(f1[i].innerHTML) == -1) {
arr.push(f1[i].innerHTML);
var index = i; //index是第一个元素
document.getElementsByClassName("f1")[i].style.borderBottom = 0 + "px";
} else {
document.getElementsByClassName("f1")[i].style.display = "none"; //隐藏重复的元素
document.getElementsByClassName("f1")[index].rowSpan += 1; //删去重复的元素,就给第一个元素的rowspan+1
}
}
console.log(arr);
</script>
</body>
</html>
结果:
结论:
使用本代码直接复制粘贴,给想合并的表格td元素加上f1类即可