js数组转树

110 阅读1分钟

js 数组转树

const arr = [
    {id: 1, name: '部门A', parentId: 0}, // 0 代表顶级节点,无父节点
    {id: 2, name: '部门B', parentId: 1},
    {id: 3, name: '部门C', parentId: 1},
    {id: 4, name: '部门D', parentId: 2},
    {id: 5, name: '部门E', parentId: 2},
    {id: 6, name: '部门F', parentId: 3},
];

function arrToTree(array) {
    let parentList = [];
    let obj = {}

    //key-value模式的hash模式
    array.forEach(el => {
        obj[el.id] = el;
    });
    /*
    此时的数据结构应该是

    {1:{id: 1, name: '部门A', parentId: 0}}
    ...
     */
    array.forEach(el => {
        //配置parentId
        let parent = obj[el.parentId];
        if (parent) {
            parent.children = parent.children || [];
            parent.children.push(el)
        } else {
            //当前没有父节点=》根节点
            parentList.push(el);
        }
    })
    return parentList;
}

console.log(arrToTree(arr))

//方法二
function getTree(data) {
    let res = [];
    data.forEach(el => {
        //每次找到 el的下一级,找不到的就是父级,直接放入数组,找到就push
        const parent = data.find(node => el.parentId === node.id)
        console.log(parent)
        if (parent) {
            parent.children = parent.children || [];
            parent.children.push(el)
        } else {
            res.push(el)
        }
    })
    return res
}

console.log(getTree(arr))