news 2026/4/21 23:30:18

如何将扁平数组转换为嵌套树形结构(JavaScript 实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何将扁平数组转换为嵌套树形结构(JavaScript 实现)

本文详解如何基于 parentid/id 关系,将一维对象数组高效构建为深度嵌套的树形结构,支持任意层级,并提供可直接运行的递归实现与关键注意事项。 本文详解如何基于 parentid/id 关系,将一维对象数组高效构建为深度嵌套的树形结构,支持任意层级,并提供可直接运行的递归实现与关键注意事项。在前端开发与数据可视化场景中,常需将后端返回的扁平化层级数据(如组织架构、设备拓扑、目录列表)转换为符合 DOM 渲染或组件库(如 Ant Design Tree、Element Plus ElTree)要求的嵌套树结构。核心挑战在于:正确识别父子关系、避免重复遍历、保证子节点按逻辑顺序挂载,且不破坏原始数据字段完整性。你当前使用的 reduce 按 type 分组的方式,本质上是横向分类(分组聚合),而非纵向层级构建——它丢失了 id 与 parentId 的引用链,自然无法生成嵌套的 children 数组。真正可行的方案是:以根节点为起点,递归查找所有 parentId 匹配当前节点 id 的子项,并为每个子项继续递归构造其子树。以下是一个简洁、健壮、无副作用的实现:function buildTree(data, rootId = '0') { // 使用 reduce 遍历全量数据,筛选出 parentId === 当前 rootId 的节点 return data.reduce((tree, node) => { if (node.parentId === rootId) { // 浅拷贝当前节点,避免污染原始数据 const newNode = { ...node }; // 递归构建其子树,并赋值给 children(注意:字段名统一为 children,非 childeren 拼写错误) newNode.children = buildTree(data, node.id); tree.push(newNode); } return tree; }, []);}// 使用示例const arrData = [ { id: "3", name: "Ctech A", parentId: "0", type: "Building" }, { id: "4", name: "3rd floor", parentId: "3", type: "Floor" }, { id: "5", name: "room_01", parentId: "4", type: "Room" }, { id: "6", name: "room_video", parentId: "4", type: "Room" }, { id: "7", name: "room_Lab", parentId: "4", type: "Room" }, { id: "8", name: "room_engg", parentId: "4", type: "Room" }, { id: "9", name: "Rack_1", parentId: "5", type: "Rack" }, { id: "10", name: "Rack_2", parentId: "5", type: "Rack" }, { id: "11", name: "Rack_3", parentId: "5", type: "Rack" }, { id: "12", name: "Shelf_01", parentId: "9", type: "Shelf" }, { id: "13", name: "Slot_1", parentId: "12", type: "Slot" }, { id: "14", name: "Slot_2", parentId: "12", type: "Slot" }, { id: "15", name: "Shelf_02", parentId: "9", type: "Shelf" }];const tree = buildTree(arrData);console.log(JSON.stringify(tree, null, 2));? 关键要点说明: 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 23:26:26

如何在 Go 中基于接口样例动态创建对象切片

本文介绍如何利用反射机制,根据一个实现了特定接口(如 encoding.binaryunmarshaler)的样例对象,在运行时动态创建该类型的新实例并初始化切片,从而实现泛型式数据库批量加载逻辑。 本文介绍如何利用反射机制&…

作者头像 李华
网站建设 2026/4/21 23:26:24

Linux 的 sha256sum 命令

Linux 的 sha256sum 命令是一个用于计算和校验文件 SHA-256 哈希值的实用工具。SHA-256(Secure Hash Algorithm 256-bit)是一种密码学哈希函数,属于 SHA-2 家族,能够生成 256 位(32 字节)的哈希值&#xff…

作者头像 李华
网站建设 2026/4/21 23:25:32

从零到一:用C++、Boost.Asio和Redis手搓一个支持Web端的高性能IM服务器

从零到一:用C、Boost.Asio和Redis手搓一个支持Web端的高性能IM服务器 1. 为什么我们需要自己造轮子? 在这个即时通讯软件泛滥的时代,你可能会有疑问:为什么还要自己实现一个IM服务器?市面上不是已经有微信、QQ、Tele…

作者头像 李华
网站建设 2026/4/21 23:24:39

ComfyUI Essentials终极指南:20+专业图像处理节点快速提升AI绘画效率

ComfyUI Essentials终极指南:20专业图像处理节点快速提升AI绘画效率 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials 在AI绘画工作流中,你是否经常遇到图像色调不一致、边缘处理不精确、批…

作者头像 李华