## js生成树结构

js生成树结构

01. 逻辑

01.1. 递归实现
function arr2Tree(data, pid = 0) {
  // 收集当前节点的所有子节点
  const child = [];
  // 收集子节点的后代节点  
  const sun = [];
  data.forEach(item => {
      if(item.pid === pid) {
        child.push(item)
      }else {
          sun.push(item)
      }
  })
  child.forEach(item => {
      // 收集子节点的子节点
      const _c = arr2Tree(sun, item.id)
      if(_c.length) {
          item.child = _c
      }
  })
  return child;
}
01.2. hashMap实现
function arrayToTree(items) {
    const result = [];   // 存放结果集
    const itemMap = {};  // 
    // 先转成map存储
    for (const item of items) {
        itemMap[item.id] = { ...item, children: [] }
    }
    for (const item of items) {
        const id = item.id;
        const pid = item.pid;
        const treeItem = itemMap[id];
        if (pid === 0) {
            result.push(treeItem);
        } else {
            if (!itemMap[pid]) {
                itemMap[pid] = {
                    children: [],
                }
            }
            itemMap[pid].children.push(treeItem)
        }

    }
    return result;
}

02. 测试数据

[
  {
    "id": 2,
    "pid": 0,
    "path": "/course",
    "name": "Course",
    "title": "课程管理"
  },
  {
    "id": 3,
    "pid": 2,
    "path": "operate",
    "name": "CourseOperate",
    "title": "实操课程",
    "link": "/course/operate"
  },
  {
    "id": 4,
    "pid": 3,
    "path": "info_data",
    "name": "CourseOperateInfoData",
    "title": "数据课程",
    "link": "/course/operate/info_data"
  },
  {
    "id": 5,
    "pid": 2,
    "path": "add",
    "name": "CourseAdd",
    "title": "增加课程",
    "link": "/course/add"
  },
  {
    "id": 6,
    "pid": 0,
    "path": "/student",
    "name": "Student",
    "title": "学生管理"
  },
  {
    "id": 7,
    "pid": 6,
    "path": "operate",
    "name": "StudentOperate",
    "link": "/student/operate",
    "title": "学生操作"
  },
  {
    "id": 8,
    "pid": 6,
    "path": "add",
    "name": "StudentAdd",
    "link": "/student/add",
    "title": "新生添加"
  }
]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值