在日常开发工作中,我们经常碰到将线性的数据转换成树的需求,今天给大家分享一个简单的转换算法。

数据结构

下面是我们转换前的数据:

[{"id":1,"parent_id":0,"name":"四川省"},{"id":2,"parent_id":0,"name":"广东省"},{"id":3,"parent_id":0,"name":"江西省"},{"id":5,"parent_id":1,"name":"成都市"},{"id":6,"parent_id":5,"name":"锦江区"},{"id":7,"parent_id":6,"name":"九眼桥"},{"id":8,"parent_id":6,"name":"兰桂坊"},{"id":9,"parent_id":2,"name":"东莞市"},{"id":10,"parent_id":9,"name":"长安镇"},{"id":11,"parent_id":3,"name":"南昌市"}
]
复制代码

我们转换后的结果是:

[{"id":1,"parent_id":0,"name":"四川省","children":[{"id":5,"parent_id":1,"name":"成都市","children":[{"id":6,"parent_id":5,"name":"锦江区","children":[{"id":7,"parent_id":6,"name":"九眼桥"},{"id":8,"parent_id":6,"name":"兰桂坊"}]}]}]},{"id":2,"parent_id":0,"name":"广东省","children":[{"id":9,"parent_id":2,"name":"东莞市","children":[{"id":10,"parent_id":9,"name":"长安镇"}]}]},{"id":3,"parent_id":0,"name":"江西省","children":[{"id":11,"parent_id":3,"name":"南昌市"}]}
]
复制代码

实现代码

let array = [{id: 1,parent_id: 0,name: "四川省"},{id: 2,parent_id: 0,name: "广东省"},{id: 3,parent_id: 0,name: "江西省"},{id: 5,parent_id: 1,name: "成都市"},{id: 6,parent_id: 5,name: "锦江区"},{id: 7,parent_id: 6,name: "九眼桥"},{id: 8,parent_id: 6,name: "兰桂坊"},{id: 9,parent_id: 2,name: "东莞市"},{id: 10,parent_id: 9,name: "长安镇"},{id: 11,parent_id: 3,name: "南昌市"}
]function listToTree(list) {let map = {};list.forEach(item => {if (! map[item.id]) {map[item.id] = item;}});list.forEach(item => {if (item.parent_id !== 0) {map[item.parent_id].children ? map[item.parent_id].children.push(item) : map[item.parent_id].children = [item];}});return list.filter(item => {if (item.parent_id === 0) {return item;}})
}
console.log(listToTree(array));
复制代码

分析

这段代码的核心就在 listToTree 方法中,这个方法分为了三个部分:

第一部分

第一部分先将数组中的所有元素都复制到 map 中(注意:这里是引用复制哦,这个细节很重要)。

第二部分

执行第二次遍历前的 map:

// map
{...,"3":{"id":3,"parent_id":0,"name":"江西省"},...
}
复制代码

然后这个时候遍历 parent_id 不等于 0 的元素:

[...,{id: 11,parent_id: 3,name: "南昌市"},...
]
复制代码

然后发现南昌市有 parent_id,我们再给 map[item.parent_id] 设置子元素,通过南昌市的 parent_id 可以推导出:

map["3"].children ? map["3"].children.push(item) : map[3].children = [item];
复制代码

上面的代码判断了是否存在 children,如果不存在则直接给它赋值,否则将值 pushchildren 中。

执行完第二步后,我们已经把子节点添加到了它的父节点上,但是我们并没有删除掉之前的子节点。所以第三部就是对数据进行过滤,只要父节点即可。

总结

需要注意的是,我们一直都是对 map 进行操作的,但是结果怎么到了 list 上呢,这就是上面提到的引用复制。

转载于:https://juejin.im/post/5cebc60de51d45777b1a3d09

js 将线性数据转为树形相关推荐

  1. JavaScript将扁平化数据转为树形结构

    首先给你一个数组list如下: var arr = [{ name: '权限管理', id: 1, parentId: 0 },{ name: '角色管理', id: 1000, parentId: ...

  2. JS二维数组转树形数据

    JS二维数组转树形数据 // 测试数据const arr = [{ id: '1', pid: '0', name: 'jack', age: 20 },{ id: '2', pid: '0', na ...

  3. 用 node.js 来制作数据可视化视频吧

    TNTWeb - 全称腾讯新闻前端团队,组内小伙伴在 Web 前端.NodeJS 开发.UI 设计.移动 APP 等大前端领域都有所实践和积累. 目前团队主要支持腾讯新闻各业务的前端开发,业务开发之余 ...

  4. 线性表、树形结构和图形结构的区别

    线性表.树形结构和图形结构的区别 线性表:数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继 树形结构:数据元素之间有明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即 ...

  5. 基于echarts+js+fexible.js实现的数据可视化适配案例(附源代码)

    介绍 数据可视化 :借助于图形化手段,清晰有效地传达与沟通信息 ECharts:是一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器,底层依赖矢量 ...

  6. 解决Python中TCP数据转为json后中文变为Ascii码的问题

    我们我们有时候会使用TCP直接传输JSON数据,这时候正确解析数据就很关键了,最近在使用Python解析TCP传输的JSON数据时就遇到了中文不能正常显示的问题. 原因分析 TCP接口数据转为json ...

  7. Java 平铺列表转为树形结构

    在业务中往往有一些数据是有层级结构的,比如数据表中原始数据如下形式 id name parentId 1 1 null 2 1-1 1 3 1-1-1 2 4 1-1 1 想要将平铺的数据变成有层次的 ...

  8. js 遍历 JSON数据

    一.遍历JSON步骤 将获取的数据转为 JSON 对象[JSON.parse(data);] 通过for in循环遍历拿到 key 和 value[for (var key in obj)]遍历JSO ...

  9. JavaScript将数组转为树形结构

    JavaScript将数组转为树形结构 1.需求 后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据).不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构. 服务器传过来的数组 c ...

最新文章

  1. 【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)
  2. 共享文件服务器迁移,服务器共享文件夹迁移
  3. MongoDB架构图解
  4. 用户登陆_「python学习笔记」用户登陆需求实现(for/if/str知识点)
  5. Linux webkit截图,CutyCapt 跨平台使用 WebKit 内核网页截图工具 - 文章教程
  6. Java操作ftp,上传,下载,删除操作
  7. MS SQL Server2008大数、小数转varchar
  8. 部署windows服务
  9. cmd上如何运行php文件,cmd - php文件在命令行可以顺利运行,在浏览器上无法正常运行...
  10. Industrial Style Transfer with Large-scale Geometric Warping and Content Preservation论文解读
  11. kali netstat使用教程
  12. View 5应用之二:瘦客户机上的虚拟桌面
  13. 设计一个用户注册页面,对用户输入的内容进行有效性验证,如用户名和密码不能为空,两次输入的密码必须相同,邮箱地址必须包含“@”符号等。
  14. 马云5年实现“无现金社会”,必须迈过这几道坎?
  15. 《薛兆丰的经济学课》课程总结4--相互依赖
  16. linux $0命令,Linux:awk命令详解
  17. Linux socket accept尽信书不如无书
  18. c语言中怎么定义布尔类型变量
  19. 数论函数 - 莫比乌斯函数与莫比乌斯反演 - 基础杜教筛
  20. 房地产企业城市置业 BI 实施分析

热门文章

  1. Visual Studio中的快捷键
  2. 一次奇怪的MySQL复制故障
  3. H3C Boot升级 Serial模式
  4. 《转》十种更好的表达“你的代码写的很烂”的方法
  5. android 搜索框 github,Github上Android简单好用的提示框推荐 | 夕辞
  6. python求无序列表中位数_python 实现在无序数组中找到中位数方法
  7. 一键ghost奥运版_超详细的纯净版windows系统重装示例
  8. Python是世界上最好的语言,你不服不行!(附资料)
  9. python神秘的魔法函数_python进阶之魔法函数
  10. scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...