先贴图为敬,
源码参考:
import { Component } from '@angular/core';
@Component({
selector: 'nz-demo-table-colspan-rowspan',
template: `
<nz-table #colSpanTable [nzData]="tableData" nzBordered>
<thead>
<tr>
<th>Tel</th>
<th>Name</th>
<th>Age</th>
<th colspan="2">Home phone</th>
<th>Address</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of colSpanTable.data; index as i">
<ng-container *ngFor="let t of mergeColumns;">
<ng-container *ngIf="data[t]!==undefined">
<td [attr.rowspan]="data[rowspan+t]">{{ data[t] }}</td>
</ng-container>
</ng-container>
<td>{{ data.name }}</td>
<td>{{ data.age }}</td>
<td>{{ data.tel }}</td>
<td>{{ data.phone }}</td>
<td>{{ data.address }}</td>
</tr>
</tbody>
</nz-table>
`
})
export class NzDemoTableColspanRowspanComponent {
listOfData = [
{
key: '1',
name: 'John Brown',
age: 32,
tel: '0571-22098909',
phone: 18889898989,
address: 'New York No. 1 Lake Park'
},
{
key: '2',
name: 'Jim Green',
tel: '0571-22098333',
phone: 18889898888,
age: 42,
address: 'London No. 1 Lake Park'
},
{
key: '3',
name: 'Joe Black',
age: 32,
tel: '0575-22098909A',
phone: 18900010002,
address: 'Sidney No. 1 Lake Park'
},
{
key: '4',
name: 'Jim Red',
age: 18,
tel: '0575-22098909A',
phone: 18900010002,
address: 'London No. 2 Lake Park'
},
{
key: '5',
name: 'Jake White',
age: 18,
tel: '0575-22098909',
phone: 18900010002,
address: 'Dublin No. 2 Lake Park'
}
];
tableData:any;
mergeColumns = ['tel'];
ngOnInit(): void {
this.tableData = this.sortAndMerge(this.listOfData);
}
private sortAndMerge(rawDataList): any[] {
const rowspan = this.rowspan, mergeColumns = this.mergeColumns;
if (rawDataList.length > 1) {//长度大于1才有资格进一步处理
const sortColumn = Object.keys(rawDataList[0]),
keySort = raw => {
for (let i = raw.length - 1; i > 0; i--) {
let newObj = {}, tmpObj = raw[i];
sortColumn.forEach(s => newObj[s] = tmpObj[s]);
raw[i] = newObj;
}
return raw;
}, compare = (a, b, c = sortColumn[0], i = 0) => {
if (a[c] === b[c]) { //等于的话进行判断是否还有后续字段需要排序,没有则返回0;有则递归进行后续字段排序处理。
if (i === sortColumn.length - 1) {//没有后续字段
return i = 0;
}
i++;
return compare(a, b, sortColumn[i], i);//递归排序后续字段
} else if (a[c] > b[c]) { //大于返回1
return 1;
} else { //小于返回-1
return -1;
}
}, arr = keySort(JSON.parse(JSON.stringify(rawDataList))).sort(compare), aLen = arr.length;
for (let i = mergeColumns.length - 1; i >= 0; i--) {//先迭代待合并列
let index = 0;
let title = mergeColumns[i];
let span = 1;//合并列属性默认为1
for (let j = 0; j < aLen; j++) {
let comp = arr[index][title];
if (arr[j][title] === comp) {
j !== index && (delete arr[j][title], span++);
j === aLen - 1 && (arr[index][rowspan + title] = span);
} else {
span > 1 && (arr[index][rowspan + title] = span, span = 1);
index = j;
}
}
}
console.log(arr);
return arr;
}
return rawDataList;
}
}
参考: 转载