// 模擬後臺返回的值 getTable () { this.tableData = [{ id: 1, region: '中國', type: [{ sortName: '器械', sortList: [{ name: '器械1' }, { name: '器械2' }] }, { sortName: '軟件', sortList: [{ name: '軟件1' }, { name: '軟件2' }, { name: '軟件3' }] }] }, { id: 2, region: '美國', type: [{ sortName: '器械', sortList: [{ name: '器械1' }, { name: '器械2' }] }, { sortName: '軟件', sortList: [{ name: '軟件1' }, { name: '軟件2' }] }] }] this.dealTable() }, // 處理表格數據 dealTable () { let getDate = [] // 存儲新表格數據 let typeIndex = [0] // 保存id,地區須要合併的值 let nameIndex = [0] // 保存類型須要合併的值 let a // id,地區須要合併的行是全部類型的長度 this.tableData.forEach((v, index) => { if (v.type && v.type.length) { a = 0 v.type.forEach((subV, i, typeData) => { if (subV.sortList && subV.sortList.length) { subV.sortList.forEach((ss, k, data) => { if (k === data.length - 1) { typeIndex.push(data.length) // 把每個類型下面數據長度存起來 a += data.length // 把全部類型下面的數據長度相加 if (i === typeData.length - 1) { nameIndex.push(a) // 類型循環完成後把數據長度存起來 } } getDate.push({ id: v.id, region: v.region, type: subV.sortName, name: ss.name }) }) } }) } }) console.log(nameIndex) // [0, 5, 4] // 看一下打印出來的規律,除去第一項,5是第一次須要合併的行 // 第二次合併又是從第五行開始合併4行 console.log(typeIndex) // [0, 2, 3, 2, 2] // 類型的數據存儲規律也是同樣,第一次合併2行 // 第二次從2行開始,合併3行,以此類推 // 根據這個規則,只須要給數據加上兩個額外的屬性控制是否合併就OK let k = 0 let t = 0 nameIndex.forEach((v, i, nameArr) => { if (nameArr[i + 1]) { getDate[k].nameIndex = nameArr[i + 1] k += nameArr[i + 1] } }) typeIndex.forEach((v, i, typeArr) => { if (typeArr[i + 1]) { getDate[t].typeIndex = typeArr[i + 1] t += typeArr[i + 1] } }) this.tableData6 = getDate console.log(getDate) // 0: {id: 1, name: "器械1", nameIndex: 5, region: "中國", type: "器械", typeIndex: 2}, // 1: {id: 1, name: "器械2", region: "中國", type: "器械"} // .... // 5: {id: 2, name: "器械1", nameIndex: 4, region: "美國", type: "器械", typeIndex: 2} }, // 表格合併方法 arraySpanMethod ({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0 || columnIndex === 1) { if (row.nameIndex) { // 若是有值,說明須要合併 return [row.nameIndex, 1] } else return [0, 0] } if (columnIndex === 2) { if (row.typeIndex) { return [row.typeIndex, 1] } else return [0, 0] } },
<el-table :data="tableData6" :span-method="arraySpanMethod" border style="width: 100%"> <el-table-column prop="id" label="ID" width="180"> </el-table-column> <el-table-column prop="region" label="深圳"> </el-table-column> <el-table-column prop="type" label="類型"> </el-table-column> <el-table-column prop="company" label="企業名稱"> </el-table-column> </el-table>
getIndex () { let arr = [] let s = 0 let table = this.tableData6 let getTable = [] table.forEach((item, i, data) => { if (arr.length) { s = arr[arr.length - 1].row + data[i - 1].company.length } arr.push({ row: s, index: item.company.length }) if (item.company && item.company.length) { item.company.forEach(subItem => { getTable.push({ id: item.id, region: item.region, type: item.type, company: subItem.name }) }) } }) this.arr = arr this.tableData6 = getTable },
// 合併表格方法 arraySpanMethod ({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) { let obj = [0, 0] this.arr.some(v => { if (rowIndex === v.row) { obj = [v.index, 1] } }) return obj } }