antd表格table多行多列合并

1.想要的效果:

2.分析数据,数组下多个对象相同的名字合并。

3.columns表头数据,data-source表格数据

正常情况下只需要合并第一列,进来直接调用 rowSpan('col_1', 后端返回的数据) 就行

第二列合并如果直接传col_2会存在,所有数据相同名字都会整合,出现表格错乱问题;需要将原始数据进行处理 调用changeArr(data) 数据变成[ { name:' xxx ', origin: [ { col_1: 'xx', col_2: 'xxx',col_3: 'xx', col_4: 'xxx',} , { ...} ] } ] 名字相同的整合在一个数组再

将origin数组在传入到rowSpan函数,最后,传入col_2和col_2得到的俩个数组进行合并成一个。

<a-table :columns="columns" :data-source="data"></a-table>
data(){
    return {
        columns:[
            {
                title: '测算单位',
                dataIndex: 'col_1',
                key: 'col_1',
                align: 'center',
                //函数返回要合并的数据
                customRender:(value,row,index)=>{
                    return {
                        children: row.col_1,
                        attrs: {
                            rowSpan: row.col1RowSpan
                        }
                    }
                }
            },
            {
                title: '最新授权指标',
                dataIndex: 'col_2',
                key: 'col_2',
                align: 'center',
                //函数返回要合并的数据
                customRender:(value,row,index)=>{
                    return {
                        children: row.col_2,
                        attrs: {
                            rowSpan: row.col2RowSpan
                        }
                    }
                }
            },
            {
                title: '对应资产名称',
                dataIndex: 'col_3',
                key: 'col_3',
                align: 'center',
            },
            {
                title: '基础参数增量',
                dataIndex: 'col_4',
                key: 'col_4',
                align: 'center',
            },
        ]
    }
}
methods:{
//合并
rowSpan(key, data){
    const arr = data.reduce((result,item)=>{
        if(result.indexOf(item[key]) < 0 ){
            result.push(item[key])
        }
        return result
    },[])
    .reduce((result,keys)=>{
        const children = data.filter((item)=> item[key] === keys )
        result = result.concat(
            children.map((item, index)=>{
                ...item,
                [`${key}RowSpan`]:index === 0 ? children.length : 0
             })
        )
        return result
    },[])
    return arr
}

//整合原始数据 相同的col_1合成一个数组
changeArr(data){
    const nameArr = []
    const resultData = []
    for(let i = 0; i < data.length; i++){
        if(nameArr.indexOf(data[i]).col_1 === -1){
            resultData.push({
                name: data[i].col_1,
                origin: [data[i]]
            })
            nameArr.push(data[i].col_1)
        }else {
            for(let j=0; j< resultData.length; j++){
                if(resultData[j].name === data[i].col_1){
                     resultData[j].origin.push(data[i])
                     break
                }
            }
        }
    }
    return resultData
},
//将col_1RowSpan和col_2RowSpan合并
resArr(arr1,arr2){
    var newArr = []
    for(let index = 0; index < arr1.length; index ++){
        const element1 = arr1[index]
        for(let index1 = 0; index1 < arr2.length; index1 ++){
        const element2 = arr2[index1]
            if(element1.col_1 == element2.col_1 &&
               element1.col_2 == element2.col_2 &&
               element1.col_3 == element2.col_3 
              ){
                 let newobj = Object.assign(element1,element2)
                 newArr.push(newobj)
               }
        }
    }
    return newArr
  }
}

4.表格合并

//正常合并第一列直接调用就行
mergeRowCell(data){
    let tableData = this.rowSpan('col_1',data)
    this.dataSource = tableData 
}

//多行合并
mergeRowCell(data){
    let tableData1 = this.rowSpan('col_1',data)
    let tableData2 = []
    this.changeArr(data).forEach((item)=>{
        tableData2.push(...this.rowSpan('col_2',item.origin))
    })
    //需要将tableData1里面存在col_1RowSpan和tableData2里面存在col_2RowSpan合并为一个数组
    this.dataSource = this.resArr(tableData1,tableData2)
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YL雷子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值