You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何遍历无限嵌套树结构获取指定id对应的子节点数据

无限嵌套树形菜单ID匹配查找实现

首先明确数据特殊点:该结构的child字段为JSON序列化字符串,不是直接可用的数组,遍历前需要先做解析处理。

可选实现方案

1. 递归实现(代码简洁,适合绝大多数常规场景)

核心逻辑:逐层遍历节点,当前节点匹配ID直接返回,不匹配就解析子节点递归查找,找到结果立刻向上返回。

function findMenuNode(menuList, targetId) {
  for (const node of menuList) {
    // 命中当前节点,返回时顺便把child解析为数组方便后续使用
    if (node.id === targetId) {
      return {
        ...node,
        child: JSON.parse(node.child || '[]')
      }
    }
    // 解析子节点列表
    const childNodes = JSON.parse(node.child || '[]')
    if (childNodes.length) {
      const hit = findMenuNode(childNodes, targetId)
      // 子节点中命中直接返回
      if (hit) return hit
    }
  }
  // 全量遍历无匹配返回null
  return null
}

// 调用方式
const matchedNode = findMenuNode(menu, '传入需要查找的id')

2. 非递归栈实现(适合菜单层级极深的场景,避免递归栈溢出)

核心逻辑:用栈手动维护待遍历的节点队列,循环取出节点比对,子节点持续入栈直到遍历完全量节点。

function findMenuNodeIterative(menuList, targetId) {
  const stack = [...menuList]
  while (stack.length) {
    const node = stack.pop()
    if (node.id === targetId) {
      return {
        ...node,
        child: JSON.parse(node.child || '[]')
      }
    }
    const childNodes = JSON.parse(node.child || '[]')
    // 倒序压栈保证遍历顺序和递归一致
    for (let i = childNodes.length - 1; i >= 0; i--) {
      stack.push(childNodes[i])
    }
  }
  return null
}

容错优化

如果接口返回的child字段可能存在非法JSON格式,给解析逻辑加错误捕获,避免页面崩溃:

function parseChild(childStr) {
  try {
    return JSON.parse(childStr || '[]')
  } catch (e) {
    console.error('子菜单数据解析异常', e)
    return []
  }
}

把上述两段实现代码里的JSON.parse替换成调用这个方法即可。

提示:常规后台管理系统的菜单层级一般不会超过10层,递归实现完全够用,只有超大型组织架构、无限级分类这类可能出现上百层嵌套的场景,才需要优先用非递归实现。


内容的提问来源于stack exchange,提问作者Faiyaz Siddique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:09:58