您现在的位置是:网站首页> 编程资料编程资料
JavaScript数组扁平转树形结构数据(Tree)的实现_javascript技巧_
2023-05-24
307人已围观
简介 JavaScript数组扁平转树形结构数据(Tree)的实现_javascript技巧_
前言
之前面试有遇到过这个问题,面试官问:如何把一个数组数据扁平,然后转化为Tree结构数据,工作中刚好也用到了,在这里总结一下。
需求大致如下
把这个数组转为树形结构数据(Tree)
const flatArr = [ { id: '01', parentId: 0, name: '节点1' }, { id: '011', parentId: '01', name: '节点1-1' }, { id: '0111', parentId: '011', name: '节点1-1-1' }, { id: '02', parentId: 0, name: '节点2' }, { id: '022', parentId: '02', name: '节点2-2' }, { id: '023', parentId: '02', name: '节点2-3' }, { id: '0222', parentId: '022', name: '节点2-2-2' }, { id: '03', parentId: 0, name: '节点3' }, ]最终结果
[ { id: '01', name: '节点1', parentId: 0, children: [ { id: '011', name: '节点1-1', parentId: '01', children: [ { id: '0111', name: '节点1-1-1', parentId: '011', children: [ ... ], }, ], }, ], }, { id: '02', name: '节点2', parentId: 0, children: [ // 如上节点1 ] }, { id: '03', name: '节点3', parentId: 0, children: [ // 如上节点1 ] } ]递归方式
递归方式实现是OK的,但是数据多的话会稍微慢一点哈
const flatArr = [ { id: '01', parentId: 0, name: '节点1' }, { id: '011', parentId: '01', name: '节点1-1' }, { id: '0111', parentId: '011', name: '节点1-1-1' }, { id: '02', parentId: 0, name: '节点2' }, { id: '022', parentId: '02', name: '节点2-2' }, { id: '023', parentId: '02', name: '节点2-3' }, { id: '0222', parentId: '022', name: '节点2-2-2' }, { id: '03', parentId: 0, name: '节点3' }, ] function getTreeData (arr, parentId) { function loop (parentId) { return arr.reduce((pre, cur) => { if (cur.parentId === parentId) { cur.children = loop(cur.id) pre.push(cur) } return pre }, []) } return loop(parentId) } const result = getTreeData(flatArr, 0) console.log('result', result)打印结果如图

非递归方式
这种方法看起来就很简单代码也很简洁
const flatArr = [ { id: '01', parentId: 0, name: '节点1' }, { id: '011', parentId: '01', name: '节点1-1' }, { id: '0111', parentId: '011', name: '节点1-1-1' }, { id: '02', parentId: 0, name: '节点2' }, { id: '022', parentId: '02', name: '节点2-2' }, { id: '023', parentId: '02', name: '节点2-3' }, { id: '0222', parentId: '022', name: '节点2-2-2' }, { id: '03', parentId: 0, name: '节点3' }, ] function getData (arr) { // 利用两层filter实现 let data = arr.filter(item => { item.children = arr.filter(e => { return item.id === e.parentId }) return !item.parentId }) return data } const res = getData(flatArr) console.log('res', res)打印结果如图

小结
实现的方法很多,选择自己喜欢的就好,到此这篇关于JavaScript数组扁平转树形结构数据(Tree)的实现的文章就介绍到这了,更多相关JavaScript数组扁平转树形结构 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
您可能感兴趣的文章:
相关内容
- 使用vue+element ui实现走马灯切换预览表格数据_vue.js_
- 没有resolve及reject的Promise是否会造成内存泄露_JavaScript_
- vue3中关于路由hash与History的设置_vue.js_
- 详解如何让JavaScript代码不可断点_javascript技巧_
- 关于javascript中伪数组和真数组的一些小秘密_javascript技巧_
- 基于Next.js实现在线Excel的详细代码_javascript技巧_
- vue3路由新玩法useRoute和useRouter详解_vue.js_
- 微信小程序拍卖商品详情页设计与交互实现代码(含倒计时、实时更新出价)_javascript技巧_
- react中使用usestate踩坑及解决_React_
- 简单谈谈Angular中的独立组件的使用_AngularJS_
