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

如何用JQ递归获取JSON中指定ID及所有关联ref引用对象

关联对象查询功能实现方案

核心逻辑说明

我们可以通过预构建id映射表提升查询效率,同时增加循环引用防护避免异常:

  • 首先将所有对象存入以id为键的映射结构,单次查询对象的时间复杂度可降至O(1)
  • 从传入的起始id开始查询,依次将匹配的对象加入结果集
  • 每次读取当前对象的ref字段判断是否继续查询:
    • ref为none时直接终止
    • ref符合id:数字格式时提取目标id,校验存在性后继续迭代
    • ref格式非法或目标id不存在时终止
  • 额外增加已访问id的校验,避免出现A引用B、B引用A的循环引用场景导致死循环

参考实现(JavaScript版本)

// 原始对象列表
const dataList = [
  {
    "id": 1,
    "ref": "id:2",
    "msg": "1"
  },
  {
    "id": 2,
    "ref": "none",
    "msg": "2"
  },
  {
    "id": 3,
    "ref": "none",
    "msg": "3"
  }
];

// 预构建id映射表
const idToObj = new Map(dataList.map(item => [item.id, item]));

function search(startId) {
  const result = [];
  const visitedIds = new Set();
  let currentId = startId;

  while (currentId && !visitedIds.has(currentId)) {
    const currentObj = idToObj.get(currentId);
    if (!currentObj) break;

    visitedIds.add(currentId);
    result.push(currentObj);

    if (currentObj.ref === 'none') break;

    // 解析引用的id
    const refMatch = currentObj.ref.match(/^id:(\d+)$/);
    if (!refMatch) break;

    currentId = parseInt(refMatch[1], 10);
  }

  return result;
}

调用效果

执行search(1)得到的返回结果如下:

[
  {
    "id": 1,
    "ref": "id:2",
    "msg": "1"
  },
  {
    "id": 2,
    "ref": "none",
    "msg": "2"
  }
]

内容的提问来源于stack exchange,提问作者SVC RVBRAND

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:18:03