数组转换为树形结构

  • 期望

    [
      { id: "01", name: "张大大", pid: "", job: "项目经理" },
      { id: "02", name: "小亮", pid: "01", job: "产品leader" },
      { id: "03", name: "小丽", pid: "02", job: "产品经理" },
      { id: "04", name: "大光", pid: "02", job: "产品经理" },
    ]
    // ----------------- 转换为 -----------------------------
    [
        { label: '项目经理-张大大', children: [
            { label: '产品leader-小亮', children: [
                { label: '产品经理-小丽'},
                { label: '产品经理-大光'}
            ]}
        ]}
    ]
    
  • 支持

    1. JSON.parse 和 JSON.stringify 实现数组深拷贝
    2. 数组 forEach 和 push
    3. || 短路语句
    4. 引用数据类型
  • 实现

     function arrToTree(data) {
          let nData = JSON.parse(JSON.stringify(data)) // 数组深拷贝,避免影响源数据
          let result = []
          let map = {};
          nData.forEach(item => { // 遍历数组 把每一项的引用放入map对象里
            map[item.id] = item;
            delete item.id // id 已经保存在了map.key里 可以删掉
          });
          nData.forEach(item => { // 再次遍历数组 决定item的去向
            let parent = map[item.pid];
            // 以下为数据处理
            item.label = item.job + '-' + item.name
            delete item.pid
            delete item.name
            delete item.job
            if (parent) {
              // 如果 map[item.pid] 有值 则 parent 为 item 的父级
              // 判断 parent 里有无children 如果没有则创建 如果有则直接把 item push到children里
              (parent.children || (parent.children = [])).push(item);
            } else {
              // 如果 map[item.pid] 找不到值 说明此 item 为 第一级
              result.push(item);
            }
          });
          return result;
    }
    
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

化身孤岛的鲸_2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值