递归遍历树结构,从某个节点开始查找其子节点中的所有叶子节点
2020/3/18 14:24:05
本文主要是介绍递归遍历树结构,从某个节点开始查找其子节点中的所有叶子节点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
现在项目中哟这样的一个需求,左边显示一棵树目录,点击目录的一级或二级节点,右边显示其子节点中的所有叶子节点,而且要求前端来做这个,不用调用接口请求了,那么,这里记录一下我的实现方法。点击叶子节点,是另外的显示,此处不做讨论。
树结构
先来构造一个树形的array:
var tree = [ { "id": 1, "lv": "L1", "pid": 0, "isLastLevel": 0, "des": "根", "children": [ { "id": 2, "lv": "L2", "pid": 1, "isLastLevel": 0, "des": "项目", "children": [ { "id": 4, "lv": "L3", "pid": 2, "isLastLevel": 1, "des": "创建", "children": null } ] }, { "id": 3, "lv": "L2", "pid": 1, "des": "任务", "isLastLevel": 0, "children": [ { "id": 5, "lv": "L3", "pid": 3, "isLastLevel": 1, "des": "创建", "children": null }, { "id": 6, "lv": "L3", "pid": 3, "isLastLevel": 1, "des": "开始", "children": null }, { "id": 7, "lv": "L3", "pid": 3, "isLastLevel": 1, "des": "结束", "children": null } ] } ] } ];
当然,实际上这棵树是后端接口返回的数据。
我们这里只是做个模拟。
树的效果:
树结构 查找所有叶子节点
/* 参数 * array 树结构 查找所有叶子节点 */ function parseTreeJson(array) { for (let index = 0; index < array.length; index++) { const element = array[index]; // 1.判断element.children是对象 if (element.children && typeof (element.children) == 'object') { parseTreeJson(element.children) } else { // 判断是否为子节点 if (element.isLastLevel === 1) { console.log(element.des + '的id:' + element.id) // 获得符合的 node nodes.push(element); // 获得符合的 nodeId nodeIds.push(element.id); } } } }
调用一下试试看:
var nodes = []; var nodeIds = []; parseTreeJson(tree); console.log('整棵树的 子节点nodeIds:' + nodeIds)
树结构 遍历查找某个节点
下面的方法用来遍历查找某个节点,然后调用上面的parseTreeJson(array)方法,实现从该节点开始查找其子节点中的所有叶子节点。
/* 参数 * array 树结构 * nodeId 某个节点的id 从该节点开始查找其子节点中的所有叶子节点 */ function loopTreeJson(array, nodeId) { for (let index = 0; index < array.length; index++) { const element = array[index]; if (element.id === nodeId) { // 判断element.children是对象 if (element.children && typeof (element.children) == 'object') { // 查找叶子节点 parseTreeJson(element.children) } } else { // 判断element.children是对象 if (element.children && typeof (element.children) == 'object') { // 继续遍历子节点查找当前nodeId loopTreeJson(element.children, nodeId) } } } }
本来应该是点击树节点,获取当前节点id后,调用loopTreeJson(tree, id)即可,这里不再粘贴html显示树的逻辑,下面是模拟调用:
nodes = []; nodeIds = []; loopTreeJson(tree, 1); console.log('点击根nodeId:1 找到的子节点nodeIds:' + nodeIds); nodes = []; nodeIds = []; loopTreeJson(tree, 2); console.log('点击项目nodeId:2 找到的子节点nodeIds:' + nodeIds); nodes = []; nodeIds = []; loopTreeJson(tree, 3); console.log('点击任务nodeId:3 找到的子节点nodeIds:' + nodeIds);
调用结果:
完整代码查看:递归遍历树结构,从某个节点开始查找其子节点中的所有叶子节点,打开这个代码示例页面,F12打开控制台可以看到输出。
参考
这篇关于递归遍历树结构,从某个节点开始查找其子节点中的所有叶子节点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-30毕设私活神器
- 2024-05-30html
- 2024-05-09一定要避坑:关于微信H5分享,温馨提示你不要再踩坑了!!!
- 2024-05-09本地项目放到公网访问!炒鸡煎蛋!
- 2024-04-07金融企业区域集中库的设计构想和测试验证
- 2024-03-11前端CSS的工程化——掌握Sass这四大特性就够了
- 2024-02-21h5关联css样式(html怎么和css关联)-icode9专业技术文章分享
- 2024-02-07Firefox禁止远程字体加速网页加载及图标字体补充安装
- 2024-02-07一个菜鸡前端的3年总结-「2023」
- 2024-01-18最火前端Web组态软件(可视化)