求教各位如何用js修改数组数据

我有这样一个数组

let options = [
    {
        id:'0001',
        label:'设备一类',
        children:[
            {
                id:'1001',
                type:'A',
                label:'A类设备1'
            },
            {
                id:'1002',
                type:'B',
                label:'B类设备1'
            },
            {
                id:'1003',
                type:'B',
                label:'B类设备2'
            },
            {
                id:'1004',
                type:'C',
                label:'C类设备1'
            },

        ]
    },
    {
        id:'0002',
        label:'设备二类',
        children:[
            {
                id:'2001',
                type:'A',
                label:'A类设备1'
            },
            {
                id:'2002',
                type:'B',
                label:'B类设备1'
            },
            {
                id:'2003',
                type:'C',
                label:'C类设备1'
            },
            {
                id:'2004',
                type:'C',
                label:'C类设备2'
            },

        ]
    }
]

希望修改数据用于el-cascader,将数据修改成为

let options = [
    {
        value:'0001',
        label:'设备一类',
        children:[
            {
                value:'A',
                label:'A类设备',
                children:[
                    {
                        value:'1001',
                        label:'A类设备1'
                    }
                ]
            },
            {
                value:'B',
                label:'B类设备',
                children:[
                    {
                        value:'1002',
                        label:'B类设备1'
                    },
                    {
                        value:'1003',
                        label:'B类设备2'
                    },
                ]
            },
            {
                value:'C',
                label:'C类设备',
                children:[
                    {
                        value:'1004',
                        label:'C类设备1'
                    }
                ]
            },
        ]
    },
]

我的设想用两次map,但是产生多个equipA,equipB,equipC

let equipOp = options.map((item)=>{
    return{
        value:item.id,
        label:item.label,
        children:item.children.map(({id,type,label})=>{
            let equipA = {
                id: 0,
                label: 'A类设备',
                value: 'A',
                children: []
            }
            let equipB =  {
                id: 1,
                label: 'B类设备',
                value: 'B',
                children: []
            }
            let equipC = {
                id: 2,
                label: 'C类设备',
                value: 'C',
                children: []
            }
            const formateObj = {
                value:id,
                label:label,
            }
            switch(type){
                case 'A': equipA.children.push(formateObj);
                    break;        
                case 'B': equipB.children.push(formateObj);
                    break;        
                case 'C': equipC.children.push(formateObj);         
                    break;
            }
            return{
                //...equipA
                //...equipB
                //...equipC
                equipA,
                equipB,
                equipC
            }
        })
    }
})
阅读 2.6k
3 个回答
function fn(options){
    const _arr = [];
    options.forEach( v => {
        const children = [];
        v.children.forEach( e => {
            const index = children.findIndex( v => v.value === e.type );
            index === -1 ? children.push( {
                value: e.type,
                label: `${e.type}类设备`,
                children: [ {
                    value: e.type,
                    label: e.label
                } ]
            } )
                :
                children[index].children.push( {
                    value: e.type,
                    label: e.label
                } );
        } );
        _arr.push( {
            value: v.id,
            label: v.label,
            children
        } );
    } );
    return _arr;
}

又是这样的数据转换问题吗,可以参照一下类似的问题多个数组 怎么转为树形结构 并需要去重

和你这个问题存在一定的相似性,不编写代码,提供思路:
你这里存在两级,设备一二类,设备ABC类。可以先定义一个设备大类数组,遍历原数据时,从该数组中取设备大类操作,如果不存在就生成新的大类,如果存在就更新大类信息;小类同上

result = options.map(every => {
    const children = every.children.map(item => {
        return {
            label: item.label,
            value: item.id
        };
    });
    return {
        label: every.label,
        value: every.id,
        children: children
    }
})
推荐问题