鍍金池/ 問(wèn)答/HTML/ 請(qǐng)教一個(gè)簡(jiǎn)單的js數(shù)組轉(zhuǎn)對(duì)象問(wèn)題

請(qǐng)教一個(gè)簡(jiǎn)單的js數(shù)組轉(zhuǎn)對(duì)象問(wèn)題

var menuArray=[
    { id: 1, name: "統(tǒng)計(jì)內(nèi)容", pid: 0 },
    { id: 2, name: "產(chǎn)品部", pid: 1 },
    { id: 3, name: "UE", pid: 2 },
    { id: 4, name: "產(chǎn)品", pid: 2 },
    { id: 5, name: "研發(fā)部", pid: 1 },
    { id: 6, name: "前端", pid: 5 },
    { id: 7, name: "Java", pid: 5 },
    { id: 8, name: "測(cè)試部", pid: 1 },
    { id: 9, name: "測(cè)試1", pid: 8 },
    { id: 10, name: "測(cè)試2", pid: 8 }
];

通過(guò)操作,把上面數(shù)據(jù)轉(zhuǎn)成下面數(shù)據(jù)

var data=[{
    id:0,
    name: "統(tǒng)計(jì)內(nèi)容",
    item:[{
            id: 2,
            name: '產(chǎn)品部',
            item: [
                {
                    id:3,
                    name: 'UE'
                },
                {
                    id:4,
                    name: '產(chǎn)品'
                }
            ]
        },
        {
            id: 5,
            name: '研發(fā)部',
            item: [
                {
                    id:6,
                    name: '前端'
                },
                {
                    id:7,
                    name: 'Java'
                }
            ]
        },
        {
            id: 8,
            name: '測(cè)試部',
            item: [
                {
                    id:9,
                    name: '測(cè)試1'
                },
                {
                    id:10,
                    name: '測(cè)試2'
                }
            ]
        }
    ]
}]

注意:數(shù)據(jù)深度不定

回答
編輯回答
夏木
var menuArray=[
    { id: 1, name: "統(tǒng)計(jì)內(nèi)容", pid: 0 },
    { id: 2, name: "產(chǎn)品部", pid: 1 },
    { id: 3, name: "UE", pid: 2 },
    { id: 4, name: "產(chǎn)品", pid: 2 },
    { id: 5, name: "研發(fā)部", pid: 1 },
    { id: 6, name: "前端", pid: 5 },
    { id: 7, name: "Java", pid: 5 },
    { id: 8, name: "測(cè)試部", pid: 1 },
    { id: 9, name: "測(cè)試1", pid: 8 },
    { id: 10, name: "測(cè)試2", pid: 8 }
];

let menuDict = menuArray.reduce((t, c)=> [c.item=[], t['' + c.id] = c, t][2], {});

let result =  menuArray.reduce((t, c)=>{
    if(menuDict[c.pid]) {
        menuDict[c.pid].item.push(c);
    } else {
        t.push(c)
    }
    return t 
}, [])

console.log(result);
2017年7月1日 05:02