深度优先遍历:JavaScript递归查找树形数据结构中的节点标签

概述

在Web开发中,我们经常需要处理树形结构数据(如组织架构、分类目录、菜单等)。今天我将分享一个实用的JavaScript方法,用于在复杂的树形数据结构中根据ID查找对应的节点标签。

核心算法

javascript 复制代码
/**
 * 根据id在树形数据结构中查找对应的节点
 * @param {string|number} id - 要查找的节点ID
 * @param {Array|Object} data - 树形数据结构(数组或对象)
 * @returns {Object|null} 找到返回完整的节点对象,找不到返回null
 */
findLabelById(id, data) {
  // 边界条件处理:如果data为空或未定义,直接返回null
  if (!data) {
    return null;
  }

  // 情况1:data是数组(树的根节点或子节点数组)
  if (Array.isArray(data)) {
    for (let i = 0; i < data.length; i++) {
      const result = this.findLabelById(id, data[i]);
      if (result !== null) {
        return result;
      }
    }
    return null;
  }

  // 情况2:data是对象(单个节点)
  if (data && typeof data === 'object') {
    // 如果当前节点的id匹配目标id,返回当前节点
    if (data.id === id) {
      return data;
    }

    // 如果当前节点有子节点,递归查找子节点
    if (data.children && Array.isArray(data.children) && data.children.length > 0) {
      for (let i = 0; i < data.children.length; i++) {
        const result = this.findLabelById(id, data.children[i]);
        if (result !== null) {
          return result;
        }
      }
    }
  }

  // 未找到匹配的节点
  return null;
}

使用示例

javascript 复制代码
const treeData = [
  {
    id: 1,
    label: "节点1",
    children: [
      {
        id: 11,
        label: "节点1-1",
        children: [
          { id: 111, label: "节点1-1-1" },
          { id: 112, label: "节点1-1-2" }
        ]
      },
      { id: 12, label: "节点1-2" }
    ]
  },
  {
    id: 2,
    label: "节点2",
    children: [
      { id: 21, label: "节点2-1" }
    ]
  }
];

查找示例

javascript 复制代码
// 查找存在的节点
const node = findLabelById(111, treeData);
console.log(node); // 输出:{ id: 111, label: "节点1-1-1" }

// 查找不存在的节点
const notFound = findLabelById(999, treeData);
console.log(notFound); // 输出:null
相关推荐
lpfasd1237 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
学逆向的8 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
Data analyse4569 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai10 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记10 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁11 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu11 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!11 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格11 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人11 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js