javascript构造重复数组(JavaScript平铺数组转树形结构的实现示例)
javascript构造重复数组
JavaScript平铺数组转树形结构的实现示例目录
- 后台丢来了1w条数据
- 递归方式
- 非递归方式
- 总结
千算万算,还是没有逃过,后台真的就上万条数据一次丢给前端了。好吧,好在还不是10w条。如下,后台返回的是这样的结构:
const flatArr = [ { id: '001', name: '节点1' }, { id: '0011', parentId: '001', name: '节点1-1' }, { id: '00111', parentId: '0011', name: '节点1-1-1' }, { id: '002', name: '节点2' }, ]
可以看到,这实际上就是一个平铺的数组,我们的需求是,要将这样数据渲染在Element-ui的级联选择器中,他接收的是如下的树形结构:
let options = [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则', children: [ { value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈'} ], } ] } ]
好家伙,这不就是需要我将平铺数组转成树形结构嘛!
一顿操作猛如虎,二话不说写递归。
大功告成,代码简洁,思路清晰,一运行,what?页面卡死了,console.time() 计算,大概使用了18s才计算出我们需要的树形结构。
我反省了下我自己,这可是上万条数据,每次从下往上递归寻找父节点的子节点时都需要遍历一次数组,这当然耗时了!而且计算时长已经明显导致了页面卡顿,此法肯定是不可取的,那么,有没有更好的方案呢?
这里巧妙的应用了对象保存的是引用的特点,每次将当前节点的 id 作为 key,保存对应节点的引用信息,遍历数组时,每次更新 objMap 的 children 信息,这样 objMap中保留了所有节点极其子节点,最重要的是,我们只需要遍历一遍数组,时间复杂度为O(n)。使用这种方式,计算时长只需要60ms!
- 递归方式:每次递归寻找当前节点的子节点时都需要重新遍历一遍数组,时间复杂度为 O(nlogn)
- 非递归方式:从根节点往下寻找子节点,通过 Map 保存每个节点及其子节点的信息,子节点保存的是 Map 上的引用,每个节点的子节点都可以在 Map 中通过 id 找到,时间复杂度为 O(n)
我们来看一个对比图:
通过上面时间复杂度随数据量增大的走势可以看出,当数据越来越大时,递归算法的耗时将远远大于非递归算法。因此,当数据量小时,使用递归算法有一定的优势,但是当数据大到一定的程度时,递归的做法的劣势将越来越明显,使用非递归算法会快很多!
最后,不得不感慨一下,通过这个对比,我们也可以明显的感受到算法的重要性,不同的实现方式,差异可以很大,这值得引起每一个 developer 对算法的重视!
到此这篇关于JavaScript平铺数组转树形结构的实现示例的文章就介绍到这了,更多相关JavaScript平铺数组转树形结构内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- javascript 模块原理(详解JavaScript引擎V8执行流程)
- javascript的执行原理(一文读懂JavaScript 中的延迟加载属性模式)
- JavaScript 常用的开发规范
- javascript的执行顺序
- JavaScript中call、apply、bind实现原理详解(JavaScript中call、apply、bind实现原理详解)
- js 定时切换图片(JavaScript定时器实现无缝滚动图片)
- javascript基本类型是哪些(详解javascript中的Strict模式)
- js tab栏案例(JavaScript实现Tab栏切换特效)
- javascript设置鼠标(JavaScript实现鼠标控制自由移动的窗口)
- 在html中使用javascript实例代码(原生 JS+CSS+HTML 实现时序图的方法)
- javascript文件解压(JavaScript 如何在线解压 ZIP 文件)
- javascript函数工具有哪些(如何让你的JavaScript函数更加优雅详解)
- js三级联动列表(基于JavaScript实现年月日三级联动)
- javascript构造重复数组(JavaScript平铺数组转树形结构的实现示例)
- js回调函数原理(关于JavaScript回调函数的深入理解)
- javascript将字符串转换成数组(如何将JavaScript将数组转为树形结构)
- 《白狐的人生》热拍 贾征宇偶像包袱难自弃 图(白狐的人生热拍)
- 七夕取消了,牛郎织女没做核酸七夕已经取消(牛郎织女没做核酸七夕已经取消)
- 网友抵制 多地取消 夏日祭 为何惹众怒(网友抵制多地取消)
- 兄弟萌,今年的七夕又取消了 思考 思考(今年的七夕又取消了)
- 七夕取消是什么梗(七夕取消是什么梗)
- 这竟然是捏出来的 20种橡皮泥玩法让你轻松hold住魔娃(这竟然是捏出来的)
热门推荐
- 谷歌gcp云认证考试(谷歌云gcp开启ssh访问并设置密码)
- 使用canvas的好坏(关于canvas绘制模糊问题的解决方法)
- cookie httponly属性
- serv-u设置文件夹权限(serv_U 域离线 解决方法)
- python制作彩色字符(Python3利用print输出带颜色的彩色字体示例代码)
- python变量与对象的关系(Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析)
- mysql存储引擎的创建与修改(关于MySQL Memory存储引擎的相关知识)
- JavaScript实现网页版贪吃蛇游戏(JavaScript实现网页版贪吃蛇游戏)
- C#中ToDictionary,ToLookup
- mysql判断表中字段是否存在(mysql插入前判断数据是否存在的操作)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9