javascript list转tree,怎么优化
export function list2Tree(data, parentId, children = "children", depth = 0) {
let res = [];
Array.isArray(data) &&
data.forEach(item => {
if (item.parentId === parentId) {
let itemChildren = list2Tree(data, item.id, children, depth + 1);
if (itemChildren.length) item[children] = itemChildren;
res.push({
...item,
depth
});
}
});
return res;
}
6000条数据时候需要 6350.08ms 多,有没有什么办法从算法层面优化一下的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
以下数据结构中,id 代表部门编号,name 是部门名称,parentId 是父部门编号,为 0 代表一级部门,现在要求实现一个 convert 方法,把原始 list 转换成树形结构,parentId 为多少就挂载在该 id 的属性 children 数组下,结构如下:
// 原始 list 如下
// 转换后的结果如下
转换方法如下:
这里用递归确实效率会有问题; 而且,你的代码对像不复用,很浪费
可以换个思路,两个循环解决树的问题。再加上遍历一次树算deep;
这样更快哟~
先看结果
6,000 条
60,000 条
再看代码
generate
用来生成数据list2tree
是题主的,用的递归makeTree
是我写的 ,用的 HashMap 缓存节点再补充一下
6000 个节点一次性渲染出来……要不考虑一下动态加载(动态渲染),展开一层渲染一层
你的代码里最大的问题在于,每次都是循环全部数据,并在其中,找到指定pid的数据
这样循环的次数会非常非常多,所以代码的时间消耗会很大
比较好的方式,可以通过两次循环搞定
第一次循环的目的是构建主键和数据的映射
第二次根据pid,在映射中查找数据,找到则为子节点,未找到或pid为null/"",则为根节点