背景

现在项目中哟这样的一个需求,左边显示一棵树目录,点击目录的一级或二级节点,右边显示其子节点中的所有叶子节点,而且要求前端来做这个,不用调用接口请求了,那么,这里记录一下我的实现方法。点击叶子节点,是另外的显示,此处不做讨论。

树结构

先来构造一个树形的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打开控制台可以看到输出。

参考

es6遍历树结构并判断_递归遍历树结构,从某个节点开始查找其子节点中的所有叶子节点...相关推荐

  1. php怎么用递归函数遍历多维数组,php递归遍历多维数组的方法

    php递归遍历多维数组的方法 本文实例讲述了php递归遍历多维数组的方法.分享给大家供大家参考.具体如下: function get_array_elems($arrResult, $where=&q ...

  2. 广度优先遍历类似于二叉树的_深度优先遍历类似于二叉树的()

    (1)[◆题库问题◆]:[单选] 深度优先遍历类似于二叉树的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 [◆参考答案◆]:A ·ℳ°.·※°∴ ╰☆╮ .·ℳ°.·※°∴ ╰☆╮ . ...

  3. es6遍历树结构并判断_实现树形结构数据 es6

    var jsonArray = { 'data':{ "List": [{ "authorityId": 1, "authorityName" ...

  4. 二叉树遍历结果推二叉树_二叉树遍历(PreOrder,InOrder,PostOrder)

    二叉树遍历结果推二叉树 In this article, we shall look into how we can perform a Binary Tree Traversal using dif ...

  5. 二叉树遍历结果推二叉树_二叉树遍历技术

    二叉树遍历结果推二叉树 二叉树 (Binary Tree) A binary tree is a finite collection of elements or it can be said it ...

  6. 多叉树的前序遍历_二叉树的非递归遍历的思考

    封面图来自wikipedia 1 简介 二叉树的深度优先遍历(前序遍历.中序遍历.后序遍历)是一个比较基本的操作.如果使用递归的做法,很容易写出相应的程序:而如果使用非递归的做法,虽然也能写出相应的代 ...

  7. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  8. 二叉树的递归遍历及非递归遍历

    二叉树的基本操作--创建.输出.查找.删除_yyy_zxc的博客-CSDN博客_二叉树的创建与输出创建二叉树过程:/*-----------第一轮循环:ch = A;p->data保存结点值b= ...

  9. 对于二叉树三种非递归遍历方式的理解

    利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...

最新文章

  1. 新看了两件家具请朋友们给点意见
  2. 安装librosa遇到LLVM问题原因是numba问题
  3. 计算机网络按功能自底而上划分,大连理工大学2011计算机期末模拟题3
  4. 挨踢脱口秀精选集汇总
  5. 【AI视野·今日Robot 机器人论文速览 第十三期】Wed, 23 Jun 2021
  6. 天池学习赛:工业蒸汽量预测4——模型验证
  7. 对称二叉树c++_二叉树:我对称么?
  8. 【HDU6051】if the starlight never fade
  9. LCD12864 液晶显示-汉字及自定义显示(并口)
  10. 凤凰项目:一个IT运维的传奇故事
  11. 颠覆式编程:软件2.0
  12. 【LeetCode-SQL】1179. 重新格式化部门表
  13. OpenWrt使能mt7620a第二个uart
  14. 如何使用GOOGLE高级搜索技巧
  15. 评定职称/积分落户,原来软考证书含金量这么大!
  16. manjaro命令和linux命令不一样,Manjaro: 一种不同的野兽
  17. Anaconda3安装tensorflow踩坑记录
  18. dockerspringboot-快速搭建FTP-Image图片服务器
  19. JS 去除Object中指定的key
  20. 一文读懂超融合与私有云的区别与联系

热门文章

  1. wxpython日期控件_[Python] wxPython 基本控件 (转)
  2. photoshop怎么扣电子签名/抠图
  3. iOS面试问题全面梳理 --持续更新
  4. C语言描述 动态规划 背包问题
  5. 如何将 ONLYOFFICE 文档 v7.2 与 Liferay 集成
  6. 4652. 纸张尺寸
  7. 怎么在windows服务器上传文件,windows服务器文件上传
  8. 微信小程序支付问题解决
  9. “自拍产业”的市场还大着呢
  10. error: invalid operands to binary % (have ‘double‘ and ‘int‘)取模mod %