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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:45:04