如何在嵌套JavaScript对象中获取指定ID的父级ID数组?
如何在嵌套JavaScript对象中获取指定ID的父级ID数组?
源对象
const obj = { id: '01', children: [ { id: '02', children: [ { id: '03', children: [], }, { id: '04', children: [ { id: '05', children: [], } ], } ], }, { id: '06', children: [ { id: '07', children: [], }, { id: '08', children: [ { id: '09', children: [], } ], } ], }, ] }
需求说明
函数需接收目标id和源对象obj作为参数:
- 输入
id = '08',结果数组应为['01', '06', '08'] - 输入
id = '05',结果数组应为['01', '02', '04', '05']
完整实现代码
const getParentsArr = (obj, targetId) => { // 先判断根节点是否就是目标ID if (obj.id === targetId) { return [obj.id]; } const path = [obj.id]; function recursiveFind(children) { for (const child of children) { path.push(child.id); // 找到目标ID,返回当前路径的拷贝 if (child.id === targetId) { return [...path]; } // 有子节点则递归查找 if (child.children.length > 0) { const result = recursiveFind(child.children); if (result) return result; } // 没找到,回溯移除当前节点ID path.pop(); } // 遍历完未找到目标 return null; } return recursiveFind(obj.children) || []; }
逻辑说明
- 初始校验:先检查根节点是否为目标ID,是则直接返回对应数组
- 路径追踪:用
path数组记录当前遍历到的节点ID链 - 递归遍历:
- 逐个遍历子节点,将ID加入路径
- 匹配到目标ID时返回路径拷贝(防止后续回溯修改结果)
- 子节点存在下级时递归查找,若递归返回有效结果则直接向上传递
- 当前节点及其子节点未找到目标时,从路径中移除当前节点ID(回溯操作)
- 兜底处理:若遍历完所有节点都未找到目标,返回空数组
测试示例
console.log(getParentsArr(obj, '08')); // 输出: ['01', '06', '08'] console.log(getParentsArr(obj, '05')); // 输出: ['01', '02', '04', '05'] console.log(getParentsArr(obj, '10')); // 输出: []
内容的提问来源于stack exchange,提问作者track_p54skate
相关产品推荐
相关产品推荐

