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

如何从嵌套结构数组中查找指定ID对象的父级ID?

问题:获取嵌套对象数组中指定节点的所有父级ID

你有一个嵌套层级的对象数组结构,当传入某个节点(比如{Id:113})时,需要返回该节点的所有父级ID组成的数组(示例中应返回[11,1])。你已经实现了选中指定ID节点并勾选所有子节点的功能,但不知道如何查找指定ID对应的父级ID。

你的数据结构如下:

[
  {
    Id:1,
    Name:"Test",
    children:[
      {
        Id:11,
        Name:"Test",
        children:[
          { Id:113, Name:"Test", children:[ ] },
          { Id:114, Name:"Test", children:[ ] }
        ]
      },
      { Id:12, Name:"Test", children:[ ] },
      {
        Id:13,
        Name:"Test",
        children:[
          {
            Id:115,
            Name:"Test",
            children:[ { Id:1111, Name:"Test", children:[ ] } ]
          }
        ]
      },
      { Id:14, Name:"Test", children:[ ] }
    ]
  },
  { Id:2, Name:"Test", children:[ ] }
]

你已实现的勾选子节点代码:

this.selectedOMStructure = function (structure, id) {
  _.each(structure, function (_item) {
    if (_item.Id == id) {
      _item.isChecked = !_item.isChecked;
      if (_item.children) {
        _this.checkAllChildren(_item.children, _item.isChecked);
      } else {
        return;
      }
    } else if (_item.children) {
      _this.selectedOMStructure(_item.children, id);
    }
  })
}

this.checkAllChildren = function (structure, value) {
  _.each(structure, function (_item) {
    _item.isChecked = value;
    if (_item.children) {
      _this.checkAllChildren(_item.children, value);
    } else {
      return;
    }
  })
}

解决方案:递归查找父级路径

我按照你使用Underscore.js的风格,写了一个递归函数来实现这个需求:

this.findParentIds = function(structure, targetId, parentIds = []) {
  let result = null;
  _.each(structure, function(item) {
    // 找到目标节点,直接返回当前记录的父级ID数组
    if (item.Id === targetId) {
      result = parentIds;
      return false; // 终止Underscore的each循环
    }
    // 当前节点有子节点,递归查找,把当前节点ID加入父路径
    if (item.children && item.children.length > 0) {
      const childResult = _this.findParentIds(item.children, targetId, [...parentIds, item.Id]);
      if (childResult) {
        result = childResult;
        return false; // 找到结果后立刻终止循环
      }
    }
  });
  return result || [];
}

代码说明:

  • 函数接收三个参数:structure是当前遍历的节点数组,targetId是要找的目标ID,parentIds是当前递归层级的父级ID路径(默认空数组)。
  • 遍历节点时,先判断是否是目标节点,是则返回当前的父路径。
  • 如果当前节点有子节点,就递归调用函数,用扩展运算符[...parentIds, item.Id]把当前节点ID加入父路径(避免修改原数组)。
  • 一旦递归找到结果,就终止循环并返回;如果全程没找到目标,返回空数组。

使用示例:

// 假设你的数据存在data变量中
const parentIds = this.findParentIds(data, 113);
console.log(parentIds); // 输出 [11, 1]

这个方法和你现有代码风格完全匹配,逻辑清晰,能准确拿到目标节点的所有父级ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:55