数组中的对象组织成一个树状结构

以下代码是根据 deptIdparentId 属性将给定的 data 数组转换成树形结构,并输出转换后的结果和原始的 data 数组。

  1. 数据定义:

    const data = [
      {
        "deptId": 4145,
        "parentId": 0,
        "deptName": "测试",
      },
      {
        "deptId": 4146,
        "parentId": 0,
        "deptName": "测试部门men",
      },
      {
        "deptId": 4147,
        "parentId": 0,
        "deptName": "测试部门menmen",
      },
      {
        "deptId": 4148,
        "parentId": 4145,
        "deptName": "测试部门-1",
      },
      {
        "deptId": 4149,
        "parentId": 4145,
        "deptName": "测试部门-2",
      },
      {
        "deptId": 4150,
        "parentId": 4147,
        "deptName": "测试部门menmen-1",
      },
      {
        "deptId": 4151,
        "parentId": 4150,
        "deptName": "测试部门menmen-1-1",
      },
    ];
    

    这里定义了一个包含部门信息的数组 data,每个部门用对象表示,包括 deptId(部门ID)、parentId(父部门ID)、deptName(部门名称)等属性。

  2. 创建映射:

    const map = {};
    data.forEach((item) => {
      map[item['deptId']] = item;
    });
    

    这段代码创建了一个 map 对象,将每个部门对象 itemdeptId 作为键存储在 map 中。这样可以通过部门ID快速查找部门对象。

  3. 构建树形结构:

    const list = [];
    data.forEach((item) => {
      const parent = map[item['parentId']];
      if (parent) {
        parent.children = parent.children || [];
        parent.children.push(item);
      } else {
        list.push(item);
      }
    });
    
    • 遍历 data 数组中的每个部门对象 item
    • 对于每个 item,通过 map 对象找到其父部门对象 parent
    • 如果找到了父部门 (parent 存在),则将当前部门 item 添加到父部门的 children 属性数组中。
    • 如果没有找到父部门 (parent 不存在,即 parentId 为0或未匹配到有效部门ID),则将当前部门 item 添加到 list 数组中,表示顶层部门或无父部门的部门。
  4. 输出结果:

    console.log('list', list);
    console.log('data', data);
    
    • list 数组包含顶层部门或无父部门的部门对象,即树的根节点数组。
    • data 数组仍然保留原始顺序和结构,但在遍历和操作过程中已经添加了 children 属性。

总结
这段代码的主要目的是将扁平的部门数据 data 转换为带有层级关系的树形结构,并在输出时展示树的顶层结构和操作后的完整部门数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值