如何从嵌套结构数组中查找指定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
相关产品推荐
相关产品推荐

