• 周五. 7月 1st, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

js 数组转树型结构数据

admin

11月 28, 2021
let arr =[
    {id:2,name:'部门1',parentId:0},
    {id:3,name:'部门2',parentId:1},
    {id:1,name:'部门3',parentId:2},
    {id:4,name:'部门4',parentId:1},
    {id:5,name:'部门5',parentId:2},
    {id:6,name:'部门6',parentId:3},
    {id:7,name:'部门7',parentId:2},
    {id:8,name:'部门8',parentId:4}
];
/**
 * 数组转树  非递归求解
 * 利用数组和对象相互引用  时间复杂度O(n)
 * @param {Object} list
 */
function totree(list,parId) {
    let obj = {};
    let result = [];
    //将数组中数据转为键值对结构 (这里的数组和obj会相互引用)
    list.map(el => {
        obj[el.id] = el;
    })
    for(let i=0, len = list.length; i < len; i++) {
        let id = list[i].parentId;
        if(id == parId) {
            result.push(list[i]);
            continue;
        }
        if(obj[id].children) {
            obj[id].children.push(list[i]);
        } else {
            obj[id].children = [list[i]];
        }
    }
    return result;
}

let res1 = totree(arr,0)

/**
 * 数组转树  递归求解
 */
function toTree(list,parId){
    let len = list.length
    function loop(parId){
        let res = [];
        for(let i = 0; i < len; i++){
            let item = list[i]
            if(item.parentId === parId){
                item.children = loop(item.id)
                res.push(item)
            }
        }
        return res
    }
    return loop(parId)
}

let result = toTree(arr,0)

发表评论

您的电子邮箱地址不会被公开。