扁平数组转树状结构

  • 扁平数组
let list = 
[
  {id:0,name:'xxx',pid:null},
  {id:1,name:'xxx',pid:0},
  {id:2,name:'xxx',pid:0},
  {id:3,name:'xxx',pid:2},
]
  • 树状结构
let tree = 
[
  {
    id:0,
    name:'xxx',
    children:{
      id:1,name:'xxx',children:{},
      id:2,name:'xxx',children:{
        id:3,name:'xxx',children:{}
      }
    }
  }
]

思路:

  • map
    key 为 id
    value 为 每一项,并为每一项添加 children 属性
    这样可以通过 id 精准地定位到某一项
  • 复制引用,而非深拷贝
    这样我们在修改 map 时,也修改了结果数组 tree

步骤

  • 第一次 for 循环
    1. map 映射 当前项的id 和 当前项
    2. 为每一项添加 children 属性
// map 
{
  0:{id:0,name:'xxx',pid:null,children:[]},
  1:{id:1,name:'xxx',pid:0,children:[]},
  2:{id:2,name:'xxx',pid:0,children:[]},
  3:{id:3,name:'xxx',pid:2,children:[]}
}
  • 第二次 for 循环
    1. 根节点放入结果数组tree
    2. 一次添加 chilredn 属性的值
function listToTree(list) {
  var map = {}, node, tree= [];
  for (let i = 0; i < list.length; i ++) {
    map[list[i].id] = list[i]; 
    list[i].children = []; 
  }
  for (let i = 0; i < list.length; i += 1) {
    list[i];
    if (list[i].pid !== null) {// 不是根节点
      map[list[i].pid].children.push(list[i]);// 放到父节点的children里
    } else { // 是根节点
      tree.push(list[i]);// 根节点计入结果数组
    }
  }
  return tree;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值