js将后台返回的数据转化为树形结构(扁平数组转树状结构)

news2024/9/29 7:30:01

前言

做项目使常遇到需要将后台返回的数据,转换为树状结构给用户展现,例如:

 这也是前端面试常考的算法题,一起来检测一下吧。

步骤

  1. 准备一个空的树对象。
  2. 遍历列表中的每个元素。
  3. 对于每个元素,根据该元素的父级ID找到其对应的父节点。
  4. 如果找到了父节点,则将该元素添加到父节点的子节点列表中。
  5. 如果没有找到父节点,则创建一个新的节点,并将该元素作为其子节点。
  6. 重复步骤 2~5,直到遍历完所有元素。
  7. 返回树对象。

代码示例

const list = [
  { id: 1, name: 'Node 1', parentId: null },
  { id: 2, name: 'Node 1-1', parentId: 1 },
  { id: 3, name: 'Node 1-2', parentId: 1 },
  { id: 4, name: 'Node 1-1-1', parentId: 2 },
  { id: 5, name: 'Node 2', parentId: null },
  { id: 6, name: 'Node 2-1', parentId: 5 },
]

function listToTree(list) {
  const map = {} // 用于存储节点 id 与节点的映射关系
  const tree = [] // 树的根节点

  // 首次遍历,将节点 id 与节点进行映射
  list.forEach(node => {
    map[node.id] = { ...node, children: [] }
  })

  // 第二次遍历,构建树结构
  list.forEach(node => {
    if (node.parentId) {
      // 如果存在父级节点,则将当前节点添加到父级节点的子节点列表中
      map[node.parentId].children.push(map[node.id])
    } else {
      // 否则,将当前节点作为根节点
      tree.push(map[node.id])
    }
  })

  return tree
}

const tree = listToTree(list)
console.log(tree)

输出:

[
  {
    "id": 1,
    "name": "Node 1",
    "parentId": null,
    "children": [
      {
        "id": 2,
        "name": "Node 1-1",
        "parentId": 1,
        "children": [
          {
            "id": 4,
            "name": "Node 1-1-1",
            "parentId": 2,
            "children": []
          }
        ]
      },
      {
        "id": 3,
        "name": "Node 1-2",
        "parentId": 1,
        "children": []
      }
    ]
  },
  {
    "id": 5,
    "name": "Node 2",
    "parentId": null,
    "children": [
      {
        "id": 6,
        "name": "Node 2-1",
        "parentId": 5,
        "children": []
      }
    ]
  }
]

运用场景

1. 文件系统:将文件系统中的文件和文件夹组织为树状结构。

2. 组织架构:在企业中,可以使用树状结构来表示员工之间的关系,从而构建组织架构图。

3. 导航菜单:在网站或应用程序的导航菜单中,通常使用树状结构来表示不同的页面层级。

4. 评论回复:在社交媒体或论坛中,用户可以对评论进行回复,这种回复关系可以使用树状结构来组织和展示。

5. 分类目录:电商网站中的商品分类、博客中的文章分类等都可以使用树状结构进行组织和展示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——fdisk命令

在线Linux命令查询工具 fdisk 查看磁盘使用情况和磁盘分区 补充说明 fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝…

ERP重构-SLA子分类账-分布式实现方案

背景 ERP中的GL总账模块,明细数据来源于各个业务模块如库存、成本、应收、应付、费控、资产等,统称为子模块,生成的账叫做子分类账。然而记账的业务逻辑各式各样,但是最终输出都是来源、类型、期间、科目、借贷金额等等关键信息。…

Java-数据结构(二)-Map:HashMap、TreeMap、LinkedHashMap

目录 一、 引言二、问题2.1 什么是Map2.2 使用Map的好处2.3 Map的底层原理2.4 Key和Value的含义2.5 Key值为什么不能重复2.6 Key值和Hash的关系 三、 HashMap3.1 初始化HashMap3.2 添加和获取元素3.3 遍历HashMap3.4 删除元素3.5实现原理①HashMap的put()方法②HashMap的get()方…

【海量数据挖掘/数据分析】 之 贝叶斯分类算法(朴素贝叶斯分类、贝叶斯分类计算流程、拉普拉斯修正、贝叶斯分类实例计算)

【海量数据挖掘/数据分析】 之 贝叶斯分类算法(朴素贝叶斯分类、贝叶斯分类计算流程、拉普拉斯修正、贝叶斯分类实例计算) 目录 【海量数据挖掘/数据分析】 之 贝叶斯分类算法(朴素贝叶斯分类、贝叶斯分类计算流程、拉普拉斯修正、贝叶斯分类…

无java环境运行jar

1、编写简单java程序。 例: public static void main(String[] args) {if(args.length>0)System.out.println("Params is:"args[0]);System.out.println("Hello word ! I am demo,,,&#xff0c…

软考高级网规考试笔记(涉及表格用图片代替_9万字左右)

作者:BSXY_19计科_陈永跃_23年7月更 BSXY_信息学院_v:CwJp0403 注:未经允许禁止转发任何内容 笔记说明: 目前还只有笔记,其他资源将会在近期更新,(笔记5.5即可,不诚勿加可以去其他地方自找找看&…

Quartz任务调度笔记

一、概念 1.1简介 Quzrtz是OpenSymphony开源组织在Job scheduling领域的开源项目 特点:Quartz具有丰富特性的"任务调度库",能够集成于任何的Java应用,小到独立的应用,大到电子商业系统。quartz能够创建亦简单亦复杂的调…

DAY35:贪心算法(二)分发饼干+摆动序列

文章目录 455.分发饼干思路两个for循环嵌套的写法为什么这种写法必须要有visited数组debug测试逻辑问题:没有进行计数逻辑问题:找到了result3个孩子 一层for循环的写法为什么这种写法一定要把小孩数组放在外面 376.摆动序列(逻辑问题&#xf…

02_04实时调度类及SMP多核处理器的实时操作系统体系结构

上一篇文章说的是普通进程的调度但同时还有实时进程在linux上面进行运行 这边来看看实时进程在linux里面怎么调度 同时linux操作系统对实时任务的处理方式和设计思想 实时调度类 Linux进程分为两大类:实时进程和普通进程。 实时进程与普通进程根本不同之处,如果系…

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

青少年机器人技术一级核心知识点:机械结构及模型(四)

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

LabVIEW大模拟数据解决方案

LabVIEW大模拟数据解决方案 比亚迪汽车对于在动力总成标定和控制部门工作的400多名工程师来说,这种投资包括实现NI的新战略和解决方案,以更好地捕获和管理大量的原始测试数据,在车辆上市前做出更明智的决策。 因为能够更好地获取更优质的数…

Go语言开发者的Apache Arrow使用指南:内存管理

如果你看了上一篇《Go语言开发者的Apache Arrow使用指南:数据类型》[1]中的诸多Go操作arrow的代码示例,你很可能会被代码中大量使用的Retain和Release方法搞晕。不光大家有这样的感觉,我也有同样的feeling:**Go是GC语言[2]&#x…

MWCS 2023,到底有些啥?(下篇)

█ 亚信科技 5G行业专网一体机: 反光太厉害了,看不太清: 这几张都是小枣妹拍的,^_^: █ 浩鲸科技 浩鲸,就是以前的中兴软创: █ 紫光展锐 6G这块,干货很多: 这次重点展示…

docker容器日志占满硬盘空间的解决方案

目录 原因分析解决方案方案一 定时清空日志文件方案二 全局容器日志大小方案三 修改日志驱动 docker常用清理空间命令 原因分析 由于默认情况下,docker使用json-file类型的日志驱动,该日志驱动默认情况下,每个容器的日志会一直追加在文件名为…

chatgpt赋能python:用Python模拟用户登录,实现多个网站的SEO优化

用Python模拟用户登录,实现多个网站的SEO优化 介绍 在互联网时代,SEO已成为许多网站提高曝光率和流量的重要手段之一。而SEO优化的一个重要方面就是网站的用户登录。然而,手动登录多个网站进行SEO操作是非常耗时耗力的。那么,有…

卷积神经网络实现猫狗分类

目录 一、环境配置二、神经网络CNN1、简介2、CNN结构3、层次说明 三、数据集准备1、下载数据集2、数据集分类 四、 猫狗分类的实例——基准模型1、构建网络模型2、配置训练方法3、转换格式4、模型训练并保存生成的模型5、结果可视化 五、调整基准模型1、图像增强2、增强后的图像…

【C语言初阶(8)】函数1

文章目录 1. 函数的介绍2. 函数的分类2.1 库函数2.2 自定义函数 3. 函数的参数4. 函数的调用4.1 传值调用4.2 传址调用 1. 函数的介绍 1. 什么是函数? 函数是完成特定任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。 一些函数执行某些动作&#xff…

Guava 之 EventBus

​​EvenBus​​​ 是 Guava 中 Pub/Sub 模式的轻量级实现。平时开发如果我们要实现自己的 Pub/Sub 模型,要写不少类,设计也挺复杂,对业务代码也有一定的侵入,但是在使用了 ​​EventBus​​ 之后就很方便了。 在 Pub/Sub 模式中…

Java——《面试题——tomcat篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…