温故知新(八零)数组转树

数组转树

将数组形式的数据结构转为树形的数据结构,例如

let arr= [
    {id:1,name:'节点1',pid:null},
    {id:2,name:'节点2',pid:null},
    {id:3,name:'节点3',pid:1},
    {id:4,name:'节点4',pid:2},
    {id:5,name:'节点5',pid:1},
    {id:6,name:'节点6',pid:3},
    {id:7,name:'节点7',pid:4},
    {id:8,name:'节点8',pid:2},
    {id:9,name:'节点9',pid:1},
    {id:10,name:'节点10',pid:3},
    {id:11,name:'节点11',pid:null}
]

//转化为

{
    id:1,
    name:'节点1',
    children:[
        {
            id:2,
            name:'节点2',
            children:[
                ...
            ]
        }
        ...
    ]
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

代码实现:

//将数组对象转换成我们需要的结构,添加children属性
function changeNode(obj){
    return {
        id:obj.id,
        name:obj.name,
        pid:obj.pid,
        children:[]
    }
}

//转换成树
function toTree(arr){
    //转换之后的对象
    let nodeObj = {};
    //结果数组,可能存在多个根节点
    let results = [];
    arr.forEach(obj=>{
        //以树之前的id作为对象的key
        nodeObj[obj.id] = changeNode(obj);
    })
    //遍历新的对象
    for(let o in nodeObj){
        if(nodeObj[o].pid){
            //如果当前对象存在pid则找到他的pid那个对象,然后把当前对象放到他的pid对象里面的children数组中
            nodeObj[nodeObj[o].pid].children.push(nodeObj[o]);
        }else{
            results.push(nodeObj[o]);
        }
    }
    //返回结果数组
    return results;
}

 

 

树形结构转为数组结构

//方式1
function flat(datas){
    let arr = [];
    datas.forEach(data=>{
        arr.push(data);
        if(!Array.isArray(data.children)){
            return arr;
        }
        
        arr = arr.concat(flat(data.children));
    })
    return arr;
}



//方式2
function flat(datas){
    return datas.reduce((pre,cur)=>{
        return pre.concat(cur,Array.isArray(cur.children)?flat(cur.children):[]);
    },[]) 
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值