递归遍历树节点

2023-11-14

  • 考虑这样一种场景,从一个object找到id对应的对象,obj如下结构:
  • 调用 fn(obj,121)
  • 返回 对应object, { id: 121,child: [],}


const obj = {
  id: 0,
  child: [
    {
      id: 1,
      child: [
        {
          id: 12,
          child: [
            {
              id: 121,
              child: [],
            }
          ],
        },
      ],
    }
  ],
};


实际操作,我们来个复杂一丢丢的:


const obj = {
  id: 0,
  child: [
    {
      id: 1,
      child: [
        {
          id: 12,
          child: [
            {
              id: 121,
              child: [
                {
                  id: 1211,
                  child: [
                    {
                      id: 1211,
                      child: [],
                    },
                  ],
                },
              ],
            },
            {
              id: 122,
              child: [
                {
                  id: 1222,
                  child: null,
                },
              ],
            },
          ],
        },
      ],
    },
    {
      id: 2,
      child: [
        {
          id: 22,
        },
      ],
    },
    {
      id: 3,
      child: [
        {
          id: 32,
          child: [],
        },
      ],
    },
  ],
};
function fn(o, id) {
  if (o.id === id) {
    return o;
  } else {
    if (o.child) {
      for (let i = 0; i < o.child.length; i++) {
        const element = o.child[i];
        // 如果有结果那么这个结果就是应该冒泡返回的内容
        // 如果没有找到不需要冒泡 程序因为没有返回值会有undefined
        const result = fn(element, id);
        // console.log(result);
        if (result && result.id === id) {
          return result;
        }
      }
    }
  }
}

console.log(fn(obj, 1222));


拓展 如果有多个呢?如何找到全部?
那需要全遍历,这时候考虑 去掉冒泡(return)采用数组push的方法


function fn2(o, id) {
  const arr = [];
  fnChild(o, id);
  function fnChild(o, id) {
    if (o.id === id) {
      console.log("fnChild result");
      arr.push(o);
      processChild(o, id);
    } else {
      processChild(o, id);
    }
  }
  function processChild(o, id) {
    if (o.child) {
      for (let i = 0; i < o.child.length; i++) {
        const element = o.child[i];
        fnChild(element, id);
      }
    }
  }
  return arr;
}

console.log(fn2(obj, 1211));


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归遍历树节点 的相关文章

随机推荐

  • 重要思想总结

    重要思想总结 求二进制序列中1的个数 检测num中某一位是0还是1 不创建临时变量交换值 判断数值的位数 判断数值的位数 获取数值的每一位数 把一个整数的二进制位的奇数位和偶数位交换 将个位数 十位数 百位数 组成一个完整的数 找素数 将秒
  • centos dhcp服务器文件,centos dhcp服务器配置

    centos dhcp服务器配置 内容精选 换一换 简要介绍PHP FPM PHP FastCGI Process Manager PHP FastCGI进程管理器 用于管理PHP进程池的软件 用于接受web服务器的请求 PHP FPM提供
  • Django错误(1146,Table 'xxxx.django_session' doesn't exist")

    原文链接 https blog csdn net BlackListMan article details 82620144 出现这种错误先检查 数据库连接设置是否成功 在setting py同级文件中的 init py 中是否添加了数据库
  • SecureCRT遇到打开错误的时候

    我的解决办法 因为我用的是安装版的 我的操作是 1 删除注册表 可查 2 关闭所有的关于securecrt的进程 通过 任务管理器 的 详细信息 仔细检查关闭 3 一般就搞定了 4 参考文档 http blog csdn net lishe
  • MyBatis Plus多表联查方法

    MyBatis Plus是一款针对MyBatis框架的增强工具 它提供了很多方便的方法来实现多表联查 你可以使用MyBatis Plus的selectPage方法来实现多表联查 该方法接收一个QueryWrapper参数 你可以在Query
  • keyCode键盘码

    下次记不住了来查查吧 keyCode 8 BackSpace BackSpace keyCode 9 Tab Tab keyCode 12 Clear keyCode 13 Enter keyCode 16 Shift L keyCode
  • linux启动kvm虚拟机,如何在Linux中使用KVM(基于内核的虚拟机)创建虚拟机 - 第1部分...

    使用KVM在Linux中创建虚拟机 第1部分 本教程讨论KVM介绍 部署以及如何使用它在RedHat为基础的分布 如RHEL CentOS7和Fedora 21来创建虚拟机 什么是KVM KVM或 基于内核的虚拟机 是面向Linux的英特尔
  • git 恢复本地代码到仓库版本_Repo和Git 版本管理常用命令总结

    1 服务器版本下载 repo init u git 192 168 1 11 i700t 60501010 platform manifest git b froyo almond m M76XXTSNCJNLYA60501010 xml
  • Vue2学习第六篇:事件处理

    一 事件的基本使用 1 使用v on xxx 或 xxx 绑定事件 其中xxx是事件名 2 事件的回调需要配置在methods对象中 最终会在vm上 3 methods中配置的函数 不要用箭头函数 否则this就不是vm了 4 method
  • 【C++初阶】仿函数和priority_queue的模拟实现(附源码)

    一 仿函数 仿函数 顾名思义就是模仿函数 它其实是一个类 类里面重载了运算符 在调用这个重载的运算符时 让我们感觉是调用函数一样 可以说相当于C语言里的函数指针一样 但是函数指针的可读性不好 不如仿函数 仿函数的特点 1 仿函数即使定义相同
  • 4.1.3 英文单词的分割符验证

    在英文文本中 各个英文单词被分隔符所分开 这些分隔符包括英文标点符号 空白字符等 其中 英文标点符号比较多 如 逗号 点号 问号 冒号 分号 单引号 感叹号 双引号 连接号 破折号 省略号 小括号 中括号 大括号 所有格符号 等 在英文文本
  • python中的并行处理(多线程)几种方式(Pool, Parallel, threading)

    1 Pool from multiprocessing import Pool import os def worker arg print begin s str arg if name main po Pool 10 定义进程池 最大进
  • Android系统apps之Setting的修改和设置

    由于接到了一个修改系统app Settings条目是需求 接着也看到了一个博主的文章http blog csdn net wangjinyu501 article details 22077803 这篇文章写的很好 基本满足了需求 我这里再
  • 《暗时间》阅读笔记一

    推荐阅读原著 https book douban com subject 6709809 https book douban com subject 6709809
  • Bert: Pre-training of Deep Bidirectional Transformers for Language Understanding

    Abstract 我们介绍了一种语言表达模型称为BERT 也就是Transformer的双边编码表示 与当前语言表达模型不同 Peters et al 2018a Radford et al 2018 BERT设计通过考虑所有层左右上下文对
  • Erlang in Mac OSX

    download the source package from the erlang website http www erlang org download html and unzip it tar zxvf otp src R14B
  • 第十届蓝桥杯省赛C++B组 迷宫

    试题 E 迷宫 本题总分 15 分 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从
  • 攻防世界weak_auth知识详解

    1 进入环境 当我们点进去的时候 出来一个网页 让我们输入username和password 先随便输入一下 然后弹出是说让我们用admin作为username登入 那我们就按照它的要求吧 进行修改 这次它只是提醒了密码错误 我们的重心开始
  • Es_算分函数使用详情

    算分函数查询 相关性计算 当我们利用match查询时 文档结果会根据与搜索词条的关联度打分 score 返回结果时按照分值降序排列 例如 我们搜索 虹桥如家 结果如下 score 17 850193 source name 虹桥如家酒店真不
  • 递归遍历树节点

    考虑这样一种场景 从一个object找到id对应的对象 obj如下结构 调用 fn obj 121 返回 对应object id 121 child const obj id 0 child id 1 child id 12 child i