扁平数据结构转换为tree结构的最优解(前端)

例如:
let arr = [
{id: 1, name: ‘部门1’, pid: 0},
{id: 2, name: ‘部门2’, pid: 1},
{id: 3, name: ‘部门3’, pid: 1},
{id: 4, name: ‘部门4’, pid: 3},
{id: 5, name: ‘部门5’, pid: 4},
]
转换为:
[
{
“id”: 1,
“name”: “部门1”,
“pid”: 0,
“children”: [
{
“id”: 2,
“name”: “部门2”,
“pid”: 1,
“children”: []
},
{
“id”: 3,
“name”: “部门3”,
“pid”: 1,
“children”: [
// 结果 ,
]
}
]
}
]
其详细过程解法如下:可以直接复制粘贴使用:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
 <script>
 let arr = [
    {id: 1, name: '部门1', pid: 0},
    {id: 2, name: '部门2', pid: 1},
    {id: 3, name: '部门3', pid: 1},
    {id: 4, name: '部门4', pid: 5},
    {id: 5, name: '部门5', pid: 2},
]

function arrayToTree(items) {
  // 存放结果
 const result = []
//  将数组中的所有对象的数据map到对象中,其中创建的对象的key是数组内每一个对象的id值
 const map_obj = {}
 
//  遍历对象
for(const key in items){

  const {id,pid} = items[key]
  if(!map_obj[id]){
    map_obj[id] = {
      children:[]
    }
  }

  map_obj[id] = {
    ...items[key],
    children:map_obj[id]['children']
  }
  // 数组内的每一个对象都是tree结构的一个分支
  const tree_item = map_obj[id]

  // pid=0,说明该数组内的这个对象是这个tree结构的根
  if(pid === 0){
    result.push(tree_item)
  }else{
    // 如果pid不等于0,那么说明这个数组内的这个对象,是tree结构的某一环
    // 此时根绝pid判断其父结构是否在树中,如果不在,那么在map_obj中预先创建坑位
    // 给其父结构准备,并且将这个子对象直接放入到其父结构的children数组中,为36行的解构对象做准备
    if(!map_obj[pid]){
      map_obj[pid] = {
        children:[]
      }
    }
    // 其父结构已经存在了,那么把这个子对象直接放入到其父结构的children数组中
    map_obj[pid]['children'].push(tree_item)
  }
}
console.log(result)
}

console.log(arrayToTree(arr))
 </script> 
</body>
</html>

这里十分感谢这位作者的开源,这篇文章主要对其内容进行了个人的理解,如果有不懂的地方可以私信或者评论,同时再次感谢该作者。

作者:杰出D
链接:https://juejin.cn/post/6983904373508145189
来源:稀土掘金

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值