如何在JS嵌套对象中按指定id搜索并获取其最近父级的id值
问题结论
该需求完全可实现,核心逻辑是提前构建「节点ID→父节点ID」的映射索引,再通过代理实现obj["目标id"]的简化访问效果。
具体实现方案
核心思路
- 深度优先递归遍历整个嵌套对象的所有节点,遍历过程中为每个带
id属性的节点,记录其最近一级父节点的id值 - 用JS原生
Proxy代理对象的属性访问逻辑,当访问的属性名匹配到已记录的节点ID时,直接返回对应的父ID,否则返回对象原有属性值
完整实现代码
// 构建ID-父ID映射表 function buildIdMap(target, parentId, map) { if (typeof target !== 'object' || target === null) return // 当前节点带id则写入映射表 if ('id' in target) { map[target.id] = parentId parentId = target.id } // 递归遍历所有子属性 for (const key in target) { if (Object.prototype.hasOwnProperty.call(target, key)) { buildIdMap(target[key], parentId, map) } } return map } // 给原对象绑定ID查询能力 function enableIdQuery(obj, rootParentId = null) { const idMap = buildIdMap(obj, rootParentId, {}) return new Proxy(obj, { get(target, prop) { // 匹配到ID则返回父ID,否则返回原属性 return prop in idMap ? idMap[prop] : Reflect.get(target, prop) } }) } // ------------ 使用示例 ------------ // 你的原始obj对象直接替换此处即可 var obj = { "level": {/* 此处省略你给出的原始对象内容,直接粘贴即可 */}, "parentId": "1631664479685x951949959612072000", "parentType": "project", "fileId": "1631664479685x951949959612072000", "uniqueId": "5b92177e-41c8-43e8-adfd-8b4e4946bc37" } // 绑定查询能力,根节点的父ID默认传入顶层parentId即可 obj = enableIdQuery(obj, obj.parentId) // 测试输出 console.log(obj["402a9267-0d36-412f-84ee-918db077f4bb"]) // 输出结果:5b92177e-41c8-43e8-adfd-8b4e4946bc37,与预期的父ID一致
补充说明
如果你的对象会动态新增/删除节点,只需要在节点更新后重新生成一次映射表即可,该方案不会修改原始对象的结构和原有属性,不会影响现有业务逻辑。
内容的提问来源于stack exchange,提问作者Serralyst0c
相关产品推荐
相关产品推荐

