js中树结构根据条件查找节点返回节点路径的一些思路
今天在项目中遇到一个问题,需要根据数据库中记录的树结构节点id获取该记录所在目录节点的路径。
大致想法,首先定义变量保存当前路径,然后递归遍历该树节点,在遍历的过程中将遍历到的节点加入到当前路径中,找到该节点后终止递归,最后返回路径即可。
问题,怎样保存当前判断节点的路径以及未找到节点时对路径的处理方法。
现附上代码:
var getPathById = function (id, catalog, callback) {
//定义变量保存当前结果路径
var temppath = "";
try {
function getNodePath(node) {
temppath += (node.name + "\\");
//找到符合条件的节点,通过throw终止掉递归
if (node.id == parseInt(cataid)) {
throw ("GOT IT!");
}
if (node.children && node.children.length > 0) {
for (var i = 0; i < node.children.length; i++) {
getNodePath(node.children[i]);
}
//当前节点的子节点遍历完依旧没找到,则删除路径中的该节点
temppath = temppath.substring(0, temppath.length - 1);
temppath = temppath.substring(0, temppath.lastIndexOf("\\")) + "\\";
}
else {
//找到叶子节点时,删除路径当中的该叶子节点
temppath = temppath.substring(0, temppath.length - 1);
temppath = temppath.substring(0, temppath.lastIndexOf("\\")) + "\\";
}
}
getNodePath(catalog);
}
catch (e) {
callback(temppath);
}
};
改进,上面的代码是将路径保存在字符串中,最终直接使用即可,更好的方法是保存在数组中。
改进代码:
var getPathById = function (id, catalog, callback) {
//定义变量保存当前结果路径
var temppath = [];
try {
function getNodePath(node) {
temppath.push(node.name);
//找到符合条件的节点,通过throw终止掉递归
if (node.id == parseInt(cataid)) {
throw ("GOT IT!");
}
if (node.children && node.children.length > 0) {
for (var i = 0; i < node.children.length; i++) {
getNodePath(node.children[i]);
}
//当前节点的子节点遍历完依旧没找到,则删除路径中的该节点
temppath.pop();
}
else {
//找到叶子节点时,删除路径当中的该叶子节点
temppath.pop();
}
}
getNodePath(catalog);
}
catch (e) {
var result = temppath.join("\\");
callback(result);
}
};
最后,只是给大家提供思路,过滤条件可以自己去定义
js中树结构根据条件查找节点返回节点路径的一些思路的更多相关文章
- Node.js中针对中文的查找和替换无效的解决方法
Node.js中针对中文的查找和替换无效的解决方法. //tags的值: tag,测试,帖子 var pos1 = tags.indexOf("测"); //这里返回-1 ta ...
- bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind
今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一 ...
- js中实现页面跳转(返回前一页、后一页)
一:JS 重载页面,本地刷新,返回上一页 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a ...
- JS中Date.parse()和Date.UTC()返回值不一致
Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,如果该字符串无法识别,或者一些情况下,包 ...
- mock.js中新增测试接口无效,返回404
项目是使用的npm+vue+mock模拟数据 我碰到的是在mock配置文件中新增接口,但是接口在测试时无效,返回404.但是在前端代码中把新接口换成配置文件中之前就有的,然后测试就正常了. 所以按问题 ...
- Js中的多条件排序,多列排序
參见github: https://github.com/Teun/thenBy.js
- JS中的函数、Bom、DOM及JS事件
本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...
- JAVA中执行JavaScript代码并获取返回值
JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...
- Excel:6种多条件查找方法
如下图所示,要求根据设备分类和品牌来查找相应的销售数量. 1. 使用VLOOKUP+辅助列进行多条件查找 本例采用的方法是在原表的最前面加一辅助列,辅助列的公式为:=B2&C2 然后再采用VL ...
随机推荐
- c# 域名转换成ip地址
tcp协议发送到某个地址端口号是,地址是域名3322.net类型,转换成ip地址.亲测两种方法都可以. 1.参考https://blog.csdn.net/szsbell/article/detail ...
- Harry Potter and J.K.Rowling(半平面交+圆和矩形交)
Harry Potter and J.K.Rowling http://acm.hdu.edu.cn/showproblem.php?pid=3982 Time Limit: 2000/1000 MS ...
- 从零开始学spring cloud(七) -------- Spring Cloud OpenFegin
一.OpenFegin 介绍 Feign是一个声明性的Web服务客户端. 它使编写Web服务客户端变得更容易. 要使用Feign,请创建一个界面并对其进行注释. 它具有可插入的注释支持,包括Feign ...
- 执行sql语句后报1055-- this is incompatible with sql_mode=only_full_group_by
这个问题是mysql5.7中存在的问题,查看原因,在任意库执行select @@sql_mode,查到的结果为ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZER ...
- 周一要做的事情Sd31y5YE
问实习生活动是否有费用 调查结果更新,提醒各个pm 修改模板,把我们追加的东西体现在模板里
- Scrapy Spider MiddleWare 设置
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...
- 前端面试之vue相关的面试题
hello,你们的小可爱,皮皮聪又来发表感想了. 首先简单概括下会遇到的问题: 1.vuex作用 ①vuex是一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化. ②vue中的多个组件之间 ...
- windows平台MySQL密码设置与破解
一:制作系统服务: 1.在cmd下输入 mysql 这个相当于启动服务端了,然后该启动客户端了 .就表示安装成功. 2.再重新开启一个 cmd 窗口.kill 进程. 输入 mysql 即可进入 my ...
- EasyPR源码剖析(6):车牌判断之LBP特征
一.LBP特征 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点. 原始的LBP算子定义在像素 ...
- Windows上Kafka运行环境安装
1. 安装JDK 1.1 安装文件:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK1.2 安装完成后需 ...