JS 树(数组存储)进行递归遍历获取路径

2023-11-11

JS 树(数组存储)进行递归遍历获取路径

 

实现功能:
通过叶子节点 id ,寻找包含该叶子节点的整条路径。(树的数据以数组形式保存)
 

直接上代码:

const getPathByKey = (curKey, data) => {
  let result = []; // 记录路径结果
  let traverse = (curKey, path, data) => {
    if (data.length === 0) {
      return;
    }
    for (let item of data) {
      path.push(item);
      if (item.id === curKey) {
        result = JSON.parse(JSON.stringify(path));
        return;
      }
      const children = Array.isArray(item.children) ? item.children : [];
      traverse(curKey, path, children); // 遍历
      path.pop(); // 回溯
    }
  }
  traverse(curKey, [], data);
  return result;
}

 

数据示例:

const data = [
  {
    code: "090",
    id: "090",
    children: [
      {
        code: "0901",
        id: "0901",
        children: [
          {
            code: "090101",
            id: "090101",
          },
          {
            code: "090202",
            id: "090202",
          },
        ]
      },
      {
        code: "0902",
        id: "0902",
      },
    ]
  },
  {
    code: "091",
    id: "091",
    children: [],
  },
  {
    code: "092",
    id: "092",
    children: [
      {
        code: "0921",
        id: "0921",
      },
      {
        code: "0922",
        id: "0922",
        children: [
          {
            code: "092201",
            id: "092201",
            children: [
              {
                code: "09220101",
                id: "09220101",
              },
            ]
          },
        ]
      },
    ]
  },
];

// ...

getPathByKey('09220101', data);

结果展示

递归遍历获取路径
 

查找 id 为 09220101 的叶子节点 到根节点的路径, 遍历后结果路径 id 正好对应。

 
这是第一次实际运用回溯思想到实际的工作当中,之前虽然有练习到回溯与寻找路径的算法题,但根据实际情况应用还是和平时的算法题有区别,实际的算法实现和数据结构还要比这里展示的复杂一些,本方法是抽取了原算法的思想及简化后的数据结构,可以作为参考。

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

JS 树(数组存储)进行递归遍历获取路径 的相关文章

随机推荐

  • 学编程太枯燥太难怎么办?

    大家好 我是老三 和大家分享一些我学编程的经历 那年二十 头发浓密如野狗 夏日炎炎 枯坐机房如木头 一根指头 颤颤巍巍如老叟 敲下了第一行 Hello World 开启了编程学习生涯 刚开始 参加的是学校的一个夏季编程训练营 起初是有学长学
  • 2023年以太坊测试网水龙头整理(包含Goerli和Sepolia)

    2023年以太坊测试网水龙头整理 包含Goerli和Sepolia 区块漫步 2023年以太坊测试网水龙头整理 包含Goerli和Sepolia 空投交互By blockwander 去中心化应用在以太坊主网上线之前 都会在以太坊测试网上先
  • 互联网摸鱼日报(2022-09-16)

    互联网摸鱼日报 2022 09 16 InfoQ 热门话题 1 从某保险机构数据库全面国产化 看如何跨越金融数据价值鸿沟 2 Flink 从实时计算到流式数仓 下一步去往哪里 3 CEO们突然介入到 IT建设 企业纷纷迁出VM虚拟机基础设施
  • 【git学习】本地关联远程仓库

    目录 一 本地仓库关联远程仓库 新建仓库 二 拉取远程分支到本地 已有远程仓库 一 本地仓库关联远程仓库 新建仓库 本地新建工程 然后关联远程git仓库并向远程仓库提交代码 1 本地新建工程 这里我使用idea创建 2 在远程仓库新建仓库
  • SIP相关的RFC文档索引

    http www packetizer com ipmc sip standards html
  • Mysql服务器安装步骤

    安装包 windows10 MySQL Server 5 7 mysql installer community 5 7 26 0 msi 安装步骤 双击运行下载好的mysql installer community 5 7 26 0 ms
  • 01--背包问题以及构造最优解

    目录 1 01 背包问题 2 构造最优解 3 动态规划法求解01 背包问题的局限性 1 01 背包问题 01 背包问题 就是有n个物品 它们有各自的体积和价值 现有给定容量的背包 如何让背包里装入的物品具有最大的价值总和 一个物品只有装与不
  • 调试flex程序

    如果程序编译时报错 需要修改程序 有时还要进行调试 在Flash中 最常用的调试方式是使用trace函数 将想要检测的对象或函数运行结果在输出面板中打印出来 在Flex中 同样可以使用trace函数来进行调试 修改上面的代码
  • 自动代码生成 - 使用Seq2Seq模型在代码生成数据集上进行自动代码生成任务。

    1 引言 自动代码生成是一个具有挑战性和实用性的任务 它可以帮助开发人员自动化生成代码 提高开发效率 在这篇博客中 我们将介绍如何使用Seq2Seq模型进行自动代码生成任务 并在代码生成数据集上进行实验 我们将使用Python作为代码生成语
  • SeleniumLibrary4.5.0 关键字详解(一)

    SeleniumLibrary4 5 0 关键字详解 一 库版本 4 5 0 库范围 全局 命名参数 受支持 简介 SeleniumLibrary是Robot Framework的Web测试库 本文档说明了如何使用SeleniumLibra
  • leetcode 编写一个函数来查找字符串数组中的最长公共前缀。

    编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 string longestCommonPrefix vector
  • Flutter控件之CircularProgressIndicator

    CircularProgressIndicator的作用 Flutter中的CircularProgressIndicator是一个圆形进度指示器 用于表示正在进行的任务的进度 它通常用于长时间运行的任务 例如文件下载 网络请求等 Circ
  • vue-amap生成地图遮罩层、点标记和弹窗

  • vmware 安装window server 2012 完只有命令窗口

    原因是 解决办法 输入 Dism online enable feature all featurename Server Gui Mgmt featurename Server Gui Shell featurename ServerCo
  • signature=27dcc93dc9d59db77c2d43c8888c8f5d,ftv-20201027

    0001659166 20 000184 txt 20201027 0001659166 20 000184 hdr sgml 20201027 20201027162536 ACCESSION NUMBER 0001659166 20 0
  • TypeError: Argument ‘bb’ has incorrect type (expected numpy.ndarray, got list)

    问题说明 这个问题是在mmdetect中使用使用自己做的coco数据集用maskrcnn做目标检测时遇到的 主要原因是你的json文件里面的segmentation中的数据不符合要求 正常来说这里面是类似于 x y x y x y x y
  • C++中placement new操作符(经典)

    C 中placement new操作符 经典 placement new是重载operator new的一个标准 全局的版本 它不能被自定义的版本代替 不像普通的operator new和operator delete能够被替换成用户自定义
  • static和final、抽象类使用详解

    这里写目录标题 static 静态导入包 final 抽象类 abstract 接口interface 这里是引用 static 放在方法上就是静态方法 放在属性上的就是静态属性 可以通过类名直接调用属性 用在方法上 同理 另外我们可以在非
  • 使用jQuery实现返回顶部功能

  • JS 树(数组存储)进行递归遍历获取路径

    JS 树 数组存储 进行递归遍历获取路径 实现功能 通过叶子节点 id 寻找包含该叶子节点的整条路径 树的数据以数组形式保存 直接上代码 const getPathByKey curKey data gt let result 记录路径结果