js 将线性数据转为树形
栏目: JavaScript · 发布时间: 6年前
内容简介:在日常开发工作中,我们经常碰到将线性的数据转换成树的需求,今天给大家分享一个简单的转换算法。下面是我们转换前的数据:我们转换后的结果是:
在日常开发工作中,我们经常碰到将线性的数据转换成树的需求,今天给大家分享一个简单的转换算法。
数据结构
下面是我们转换前的数据:
[ { "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
,如果不存在则直接给它赋值,否则将值 push
到 children
中。
执行完第二步后,我们已经把子节点添加到了它的父节点上,但是我们并没有删除掉之前的子节点。所以第三部就是对数据进行过滤,只要父节点即可。
总结
需要注意的是,我们一直都是对 map 进行操作的,但是结果怎么到了 list 上呢,这就是上面提到的引用复制。
以上所述就是小编给大家介绍的《js 将线性数据转为树形》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- MySQL 实现树形的遍历
- 巧用 MyBatis 构建树形结构
- 树形结构数据存储方案(五):区间嵌套
- 树形结构数据存储方案(三):闭包表
- 树形结构数据存储方案(二): 物化路径
- PostgreSQL_树形结构的递归查询
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Creative Curve
Allen Gannett / Knopf Doubleday Publishing Group / 2018-6-12
Big data entrepreneur Allen Gannett overturns the mythology around creative genius, and reveals the science and secrets behind achieving breakout commercial success in any field. We have been s......一起来看看 《The Creative Curve》 这本书的介绍吧!
JSON 在线解析
在线 JSON 格式化工具
HSV CMYK 转换工具
HSV CMYK互换工具