JavaScript如何从嵌套对象树中按id键查找对应目标对象
嵌套JSON树按ID查找对象的实现方案
首先给出最常用的递归实现方案,适配你给出的调用规则:
1. 递归实现(适合单次/少量查找场景)
核心逻辑:深度优先遍历整棵树,当前节点匹配则直接返回,不匹配则遍历所有子节点递归查找,匹配到就终止遍历返回结果。
完整可运行代码:
// 你的嵌套对象根节点 const root = { "id": "A", "name": "Item A", "child": [ { "id": "B", "name": "Item B", "child": [ { "id": "C", "name": "Item C", "child": [] } ] }, { "id": "D", "name": "Item D", "child": [] } ] }; // 查找函数 function findObject(targetId, currentNode = root) { // 匹配当前节点直接返回 if (currentNode.id === targetId) { return currentNode; } // 遍历子节点递归查找 for (const child of currentNode.child) { const matchResult = findObject(targetId, child); if (matchResult) return matchResult; } // 整棵树无匹配返回null return null; }
调用测试:
var result = findObject("C"); console.log(result); // 输出:{id: 'C', name: 'Item C', child: Array(0)}
2. 索引映射实现(适合频繁查找场景)
如果需要多次调用查找函数,推荐预先遍历一次树构建ID映射表,后续查找时间复杂度为O(1),性能更高:
const idMap = new Map(); // 只需要初始化执行一次,构建ID到对象的映射 function buildIdMap(node = root) { idMap.set(node.id, node); node.child.forEach(child => buildIdMap(child)); } buildIdMap(); // 查找函数直接从映射表取值 function findObject(targetId) { return idMap.get(targetId) || null; }
此前方案失败原因说明
- 递归方案:大概率是你没有正确处理递归返回值的传递,比如子节点匹配到结果后没有提前终止遍历、返回结果到上层调用
- JSON.stringify 方案:该方法返回的是字符串类型,本身没有
findObject方法,就算用正则匹配序列化结果也只能拿到字符串片段,无法返回原对象引用,本身不适用该需求。
内容的提问来源于stack exchange,提问作者Almero Rick
相关产品推荐
相关产品推荐

