数组转树形结构的两种实现

简介: 数组转树形结构的两种实现

先假设数组数据:

const arr = [
  { id: '01', name: '张大大', pid: '', job: '项目经理' },
  { id: '02', name: '小亮', pid: '01', job: '产品leader' },
  { id: '03', name: '小美', pid: '01', job: 'UIleader' },
  { id: '04', name: '老马', pid: '01', job: '技术leader' },
  { id: '05', name: '老王', pid: '01', job: '测试leader' },
  { id: '06', name: '老李', pid: '01', job: '运维leader' },
  { id: '07', name: '小丽', pid: '02', job: '产品经理' },
  { id: '08', name: '大光', pid: '02', job: '产品经理' },
  { id: '09', name: '小高', pid: '03', job: 'UI设计师' },
  { id: '10', name: '小刘', pid: '04', job: '前端工程师' },
  { id: '11', name: '小华', pid: '04', job: '后端工程师' },
  { id: '12', name: '小李', pid: '04', job: '后端工程师' },
  { id: '13', name: '小赵', pid: '05', job: '测试工程师' },
  { id: '14', name: '小强', pid: '05', job: '测试工程师' },
  { id: '15', name: '小涛', pid: '06', job: '运维工程师' }
]

递归

/**
     * json格式转树状结构
     * @param   {json}      json数据
     * @param   {String}    一级节点pid
     * @return  {Array}     数组
     */
 transListDataToTreeData(list, root) {
      const arr = [];
      // 1.遍历
      list.forEach((item) => {
        // 2.首次传入空字符串  判断list的pid是否为空 如果为空就是一级节点
        if (item.pid === root) {
          // 找到之后就要去找item下面有没有子节点  以 item.id 作为 父 id, 接着往下找
          const children = transListDataToTreeData(list, item.id);
          if (children.length > 0) {
            // 如果children的长度大于0,说明找到了子节点
            item.children = children;
          }
          // 将item项, 追加到arr数组中
          arr.push(item);
        }
      });
      return arr;
    }
transListDataToTreeData(arr,'')

对象形式

/**
     * json格式转树状结构
     * @param   {json}      json数据
     * @return  {Array}     数组
     */
    transData(arr) {
      let r = [],
        hash = {},
        i = 0,
        j = 0,
        len = a.length;
      for (; i < len; i++) {
        hash[a[i].id] = a[i];
      }
      // console.log(hash,'hash');
      for (; j < len; j++) {
        let aVal = a[j],
          hashVP = hash[aVal.pid];
        aVal.label = aVal.name;
        if (hashVP) {
          !hashVP.children && (hashVP.children = []);
          hashVP.children.push(aVal);
        } else {
          r.push(aVal);
        }
      }
      // console.log(r);
      return r;
    }
transData(arr);


目录
相关文章
|
6月前
|
缓存 JavaScript 前端开发
《凭什么撼动Node.js?Bun和Zig性能优势深度揭秘》
Node.js长期主导服务器端运行时,但新兴的Bun和Zig正带来新挑战。Bun是一款高性能JavaScript运行时,基于Zig语言开发,启动速度快4倍于Node.js,依赖管理效率提升25倍。它集成了打包、转译、测试等功能,简化开发流程。Zig则以精细的内存管理和跨平台能力助力Bun性能飞跃,同时在服务端渲染、命令行工具开发等场景中表现出色。尽管Node.js生态成熟,Bun和Zig正逐步改写JavaScript运行时格局,推动技术进步。
236 15
|
10月前
|
存储 资源调度 JavaScript
一文带你了解PNPM以及 npm,yarn,pnpm区别
一文带你了解PNPM以及 npm,yarn,pnpm区别
698 9
|
4天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
2天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
3天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
4天前
|
Linux 虚拟化 iOS开发
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
901 4
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
|
6天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
588 2