如何用循环遍历树结构_遍历树形结构-程序员宅基地

技术标签: js相关  javascript  

前言:作为前端,经常遇见要处理树形结构的数据(比如菜单、树形结构的人员组织),之前常规的操作就是使用递归遍历,但最近发现递归容易出现栈溢出,所以开始思考有没有其他方式来实现遍历,既能提高性能又能避免栈溢出。

1、首先写个方法生成一个简单的树结构

function createTree(deep){
	var children={};
	var tree={id:0,children};
	for(var i=1;i<=deep;i++){
		children.id=i;
		children.children={}
		children=children.children;
	}
	return tree;
}

2、测试递归的效率

function recursive(node){
	var result=[node.id];
	if(node.children&&node.children.id){
		result=result.concat(recursive(node.children));
	}
	return result;
}
var tree=createTree(7000);
// console.time、console.timeEnd可用于计算执行开销的方法,可替代方法console.log(new Date().getTime() - start)
console.time('digui')
console.log("输出结果",recursive(tree));
console.timeEnd('digui')

3、测试迭代,循环方式的效率,很明显效率更高

function iterat(tree){
	var result=[];
	var node=tree;
	while(node.id!=undefined){
		result.push(node.id);
		node=node.children;
	}
	return result;
}

console.time('循环')
console.log("输出结果",iterat(tree));
console.timeEnd('循环')

4、当把树结构的var tree=createTree(7000)改成var tree=createTree(10000);

递归就会报错

 遍历仍然可用

总结:对于层级结构不太深入的,可使用递归,递归结构也更方便理解,对于层级结构特别多的,建议使用迭代循环,效率更高,也可避免栈溢出。

参考资料:Javascript如何优雅的遍历树形数据结构_淘人居士的博客-程序员宅基地_遍历树形数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_34626741/article/details/123844488

智能推荐

数学建模(5.3)相关系数_皮尔逊相关系数假设检验_皮尔逊假设检验自由度n是什么-程序员宅基地

文章浏览阅读1.4k次。数学建模(5.3)相关系数_皮尔逊相关系数假设检验对于相关系数大小的解释_皮尔逊假设检验自由度n是什么

离散数学逻辑常用公式_离散数学推理规则公式-程序员宅基地

文章浏览阅读1.7w次,点赞19次,收藏109次。等值关系式重言蕴含式真值表_离散数学推理规则公式

idea中properties配置文件显示中文_idea properties 显示中文备注-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏2次。有时我们打开.properties文件时,中文显示为utf8编码格式,可以在file->setting->editor->file encodings下把transparent native-to-ascll conversion勾选上就行了。_idea properties 显示中文备注

海康摄像头视频解码_摄像头视频流控解码-程序员宅基地

文章浏览阅读4.6k次。海康视频解码YUV420p格式_摄像头视频流控解码

运维监控系列(1)- IT监控系统简介_netflix的use方法-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏12次。资料地址官网:https://prometheus.io/Github: https://github.com/prometheus/prometheus什么是普罗米修斯Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 。自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。现在,它是一个独立的开源项目,并且独立于任何公司进行维护。为了强调这一点并阐明项目的治理结构,Prometheus在2016年加入了 Cloud_netflix的use方法

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...-程序员宅基地

文章浏览阅读1.2k次。原标题:大学值得选的“选修课”,一点不比专业课差,能选上最好认真听文/小哈你是怎样对待你的选修课的?以前经常听学长学姐们说过这样一句话,“上大学之后,专业课选逃,选修课必逃”。不知道大家是不是也是这样的呢?很多同学其实对于自己的选修课并不是十分在意,甚至是抱有那种可有可无的态度,更有很多人理所应当的认为选修课就是拿来逃课用的。 所以,大家在上选修课的时候也基本都不怎么认真,完全就是冲着学分去的。如..._大学选修课和编程有关的

随便推点

L1-040 最佳情侣身高差 (10 分)_python最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。下面-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏3次。L1-040 最佳情侣身高差 (10 分)专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。输入格式:输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用..._python最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。下面

redis源码分析之发布订阅(pub/sub)_c++ redis pub subs-程序员宅基地

文章浏览阅读251次。redis算是缓存界的老大哥了,最近做的事情对redis依赖较多,使用了里面的发布订阅功能,事务功能以及SortedSet等数据结构,后面准备好好学习总结一下redis的一些知识点。先看下redis发布订阅的结构:其中发布者跟订阅者之间通过channel进行交互,channel分为两种模式。一、redis发布订阅命令简介redis中为发布订阅(pub/sub)功能提供了六个命令,分为两种模式。由_c++ redis pub subs

求一个括号序列的合法子串个数-程序员宅基地

文章浏览阅读4.4k次。dp[i]表示以i结尾的合法的括号序列个数维护一个栈,左括号push他的位置到栈中,右括号取出栈顶 dp[i] = dp[sta[top] - 1] + 1然后对dp数组求和int sta[MAXN * 10], top, ans[MAXN * 10];ll Ans;char s[MAXN * 10];int main() { in, s + 1; int len = str..._输出s中不同的合法括号子序列的数量

第一章传感器技术基础_hysteresis 响应差-程序员宅基地

文章浏览阅读1.2k次。第一章 传感器技术基础传感器的静态特性指标1️⃣线性度(Linearity):是指传感器的输出与输入之间数量关系的线性程度2️⃣迟滞(Hysteresis,回差):传感器在正(输入量增大)反(输入量减小)行程中输入曲线不重合程度的指标3️⃣重复性(Repeatability):是指传感器在输入同一方向连续多次变动时所得特性曲线不一致的程度️灵敏度(Sensitivity):传感器输出..._hysteresis 响应差

Linux-搭建syslog日志接受服务器_syslog 514-程序员宅基地

文章浏览阅读2.2k次。syslog日志接受服务器适用于centos6以上且使用rsyslog服务的终端环境1.采用UDP协议发送和接收,在远程服务器端配置文件/etc/rsyslog.conf开启下面两行# Provides UDP syslog reception$ModLoad imudp$UDPServerRun 5142.编辑/etc/sysconfig/syslog文件,让服务器能够接受客户端传来的数据:在“SYSLOGD_OPTIONS”行上加“-r”选项以允许接受外来日志消息。# vi /etc/_syslog 514

CentOS6.5 添加开机自启动脚本_centos 6 自动重启 脚本-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏4次。有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务。在解问题之前先来看看Linux的启动流程。一、Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确定运行级别 4. 加载开机启动程序 5. 用户登录启动流程的具体细节可以看看Linux 的启动流程 第4步加载启动程序其实是两步:init进程逐一加载开机启动程序,..._centos 6 自动重启 脚本

推荐文章

热门文章

相关标签