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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 22:03:00