如何用JQ递归获取JSON中指定ID及所有关联ref引用对象
关联对象查询功能实现方案
核心逻辑说明
我们可以通过预构建id映射表提升查询效率,同时增加循环引用防护避免异常:
- 首先将所有对象存入以id为键的映射结构,单次查询对象的时间复杂度可降至O(1)
- 从传入的起始id开始查询,依次将匹配的对象加入结果集
- 每次读取当前对象的ref字段判断是否继续查询:
- ref为
none时直接终止 - ref符合
id:数字格式时提取目标id,校验存在性后继续迭代 - ref格式非法或目标id不存在时终止
- ref为
- 额外增加已访问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
相关产品推荐
相关产品推荐

