参考的思路链接:https://www.cnblogs.com/rabbit-lin0903/p/12047963.html
感觉原博主的方法比我写得简洁。。我的有点繁琐,我是写到了一半思路断了,不知道找寻firstIndex,然后看到原博主的思路和代码接着写下去的,写出来重新巩固一下思路,后面看看我这菜鸡能不能做下优化,或者大佬们指点一下。
- 如果后端返回的数据没有进行排序,先将数据排序
- 将tableData数据去重,得到一个数组。
- 循环该数组,并在该数组里循环tableData。同一组数据下,找到tableData里的标识 与 去重数组里标识相同的firstIndex(合并行时的rowIndex),并计算出该组数据的长度(rowspan)
/**
* 获取要合并的数据的firstIndex和rowspan
*/
getColSpanData() {
this.tableData = this.tableData.sort(function(a, b) {
return a["projectName"].localeCompare(b["projectName"], "zh-CN");
});
// 1.首先要对项目去重
let list = [];
for (var i = 0; i < this.tableData.length; i++) {
for (var j = i + 1; j < this.tableData.length; j++) {
if (this.tableData[i].projectName == this.tableData[j].projectName) {
++i;
}
}
list.push(this.tableData[i]);
}
console.log(list, this.tableData);
// 首先找到新的项目名字 就将该项目名字放入到列表里 然后找到该项目名字出现了多少次 就等于需要合并的单元格
// 2.循环去重后的list和表格数据,表格数据里每有数据和list相同时+1 colLength;
for (let i = 0; i < list.length; i++) {
let colLength = 0;
for (let j = 0; j < this.tableData.length; j++) {
let item = this.tableData[j];
if (item.projectName === list[i].projectName) {
colLength++;
// 找到相同数据的 第一个在tableData里的index
if (list[i].firstIndex === undefined) {
list[i]["firstIndex"] = j;
}
}
}
list[i]["colLength"] = colLength;
}
this.colSpanArr = Object.assign([], list);
}
/**
* 合并行
*/
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// console.log(1, rowIndex);
// 为第一列时,每条数据只会执行1次console。否则有几个td就console几次()
// 只合并第一列
if (columnIndex === 0) {
// 找到当前行数index是否是colSpan里的一个index
let index = this.colSpanArr.findIndex((item) => {
//遍历数组
return item.firstIndex === rowIndex;
});
// 如果是 那么就找到当前数据的索引 ,然后rowspan 合并当前项目的条数
if (index > -1) {
return {
rowspan: this.colSpanArr[index].colLength,
colspan: 1,
};
} else {
return {
rowspan: 0,
colspan: 0,
};
}
}
},