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

JS中按属性检索嵌套集合,获取不含同级兄弟节点的完整分支

解决方案

你原来的代码只返回了匹配的叶子节点,我们只需要调整递归返回逻辑,在找到子节点匹配项时,同步返回当前层级的节点并只保留匹配的子分支即可,具体实现如下:

const getMatchedBranch = (data, targetId) => {
  for (const node of data) {
    // 处理叶子节点(无items的末端节点)
    if (!node.items) {
      if (node.id === targetId) return { ...node };
      continue;
    }
    // 递归查找子节点
    const matchedSub = getMatchedBranch(node.items, targetId);
    if (matchedSub) {
      // 子节点匹配成功,返回当前节点并仅保留匹配的子分支
      return {
        ...node,
        items: [matchedSub]
      };
    }
  }
  // 无匹配项返回undefined
  return;
};

// 调用示例,输出结构与你要求的完全一致
const result = getMatchedBranch(array, '4');
const output = result ? [result] : [];
console.log(output);

逻辑说明

  • 递归从顶层节点向下遍历,叶子节点层直接校验id是否匹配,匹配就返回自身
  • 非叶子节点层优先递归查找子节点,只要子节点返回了匹配结果,就返回当前节点的副本,将items属性替换为仅包含匹配子项的数组,自动过滤同层级的其他兄弟节点
  • 最终得到的就是从根节点到目标id节点的完整单链结构,无多余的兄弟节点

如果你的节点包含items以外的复杂属性,可以把{ ...node }替换成你常用的深拷贝方法,避免修改原对象产生副作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:24:03