将对象数组转换为树结构

442 阅读1分钟

将对象数组转换为树结构,parentId等于父节点的id,若parentId0,则此节点为父节点

let arr = [
    { id: 1, name: '陕西',parentId: 0},
    { id: 2, name: '山西',parentId: 0},
    { id: 3, name: '四川',parentId: 0},
    { id: 4, name: '西安',parentId: 1},
    { id: 5, name: '咸阳',parentId: 1},
    { id: 6, name: '渭南',parentId: 1},
    { id: 7, name: '侯马',parentId: 2},
    { id: 8, name: '雅安',parentId: 3},
]

function toTree(){
    let obj = {}
    let brr = []

    arr.forEach( item => {
        obj[item.id] = item
    })
     /*obj = {1:{ id: 1, name: '陕西',parentId: 0},
                2:{ id: 2, name: '山西',parentId: 0},
                3:{ id: 3, name: '四川',parentId: 0},
                4:{ id: 4, name: '西安',parentId: 1},
                5:{ id: 5, name: '咸阳',parentId: 1},
                6:{ id: 6, name: '渭南',parentId: 1},
                7:{ id: 7, name: '侯马',parentId: 2},
                8:{ id: 8, name: '雅安',parentId: 3},
        }*/

    arr.forEach( item => {
        let parent = obj[item.parentId]
        /*parent = 
        undefined,//这是第一次的结果
        undefined,//二
        undefined,//三
        { id: 1, name: '陕西',parentId: 0},//四
        */
        
        if(parent){
        //第四次的时候,走到这个判断中,给{ id: 1, name: '陕西',parentId: 0}对象添加一个属性children,值为item
            (parent.children || (parent.children = [])).push(item)
        }else{
        //前三次的时候走到这个分支
            brr.push(item)
        }
    })
    return brr
}

console.log(toTree(arr))

//结果
[
    { id: 1, 
    name: '陕西',
    parentId: 0
    children:[
        { id: 4, name: '西安',parentId: 1},
        { id: 5, name: '咸阳',parentId: 1},
        { id: 6, name: '渭南',parentId: 1},
        ]},
    { 
    id: 2,
    name: '山西',
    parentId: 0
    children:[
        { id: 7, name: '侯马',parentId: 2},
    ]},
    { id: 3, 
    name: '四川',
    parentId: 0,
    children:[
        { id: 8, name: '雅安',parentId: 3},
    ]},
]