vue数组改造对象形式

              const list = [
                    { fileName: "1.png", nodeId: "bidding-project-apply" ,name:null},
                    { fileName: "2.png", nodeId: "bidding-project-apply" ,name:null},
                    { fileName: "3.png", nodeId: "bidding-it-risk" ,name:null},
                    { fileName: "2.png", nodeId: "bidding-it-risk" ,name:null},
                    { fileName: "4.png", nodeId: "bidding-reported-material" ,name:null},
                    { fileName: "5.png", nodeId: "bidding-bid-opening-evaluation" ,name:'附件1'},
                    { fileName: "6.png", nodeId: "bidding-bid-opening-evaluation",name:'附件2' },
                    { fileName: "7.png", nodeId: "bidding-bid-opening-evaluation" ,name:'附件3'}
                ]

原数组改成下面的对象

         obj = {
                    'bidding-bid-opening-evaluation': {
                        '附件1': [
                            { fileName: "5.png", nodeId: "bidding-bid-opening-evaluation", name: '附件1' }
                        ],
                        '附件2': [
                            { fileName: "6.png", nodeId: "bidding-bid-opening-evaluation", name: '附件2' },
                        ],
                        '附件3': [
                            { fileName: "7.png", nodeId: "bidding-bid-opening-evaluation", name: '附件3' }
                        ]
                    },
                    'bidding-it-risk': {
                        'fileList': [
                            { fileName: "3.png", nodeId: "bidding-it-risk", name: null },
                            { fileName: "2.png", nodeId: "bidding-it-risk", name: null }
                        ]
                    },
                    'bidding-project-apply': {
                        'fileList': [
                            { fileName: "1.png", nodeId: "bidding-project-apply", name: null },
                            { fileName: "2.png", nodeId: "bidding-project-apply", name: null }
                        ]
                    },
                    'bidding-reported-material': {
                        'fileList': [
                            { fileName: "4.png", nodeId: "bidding-reported-material", name: null }
                        ]
                    }
                }

这种怎么改造好?

一次遍历就解决了

let res = list.reduce((o, item) => {
    let parent = o[item.nodeId] || (o[item.nodeId] = {})
    let key = item.name || 'fileList'
    let arr = parent[key] || (parent[key] = [])
    arr.push(item)
    return o
}, {})

规则是 nodeId 相同的加入到一个对象里 并且 name 有值 话还得 把不同name提取出来 放到一个数组 。name 为 key值 数组为value。name为null 直接放到 fileList?