JavaScript如何按ID匹配合并两个数据库查询返回的JSON对象
JavaScript 实现两个JSON查询结果的合并逻辑
实现思路:
- 先将第一个查询结果中的IRB节点转换为以id为键的映射表,避免每次匹配都循环遍历数组,大幅提升查找效率
- 遍历第二个查询结果中的知情同意书节点,通过IRBId字段从映射表中取出对应IRB数据,新增irb属性挂载到节点上即可
完整代码实现
function mergeIRBData(irbQueryResult, consentQueryResult) { // 构建IRB映射表 const irbMap = new Map(); irbQueryResult.data.IRBs.nodes.forEach(irbItem => { irbMap.set(irbItem.id, irbItem); }); // 遍历合并数据 return consentQueryResult.data.informedConsentForms.nodes.map(consentItem => { const matchedIRB = irbMap.get(consentItem.IRBId); // 展开运算符做浅拷贝,不修改原始查询结果 return { ...consentItem, irb: matchedIRB ? { ...matchedIRB } : null }; }); }
使用示例
// 替换为你实际从数据库查询得到的两个结果 const irbResult = { "data":{ "IRBs":{ "nodes":[ {"id":"8","name":"Admin "}, {"id":"9","name":"Again"} ] } } }; const consentResult = { "data":{ "informedConsentForms":{ "count":3, "nodes":[ {"id":"93","IRBId":"9"}, {"id":"92","IRBId":"8"}, {"id":"91","IRBId":"8"} ] } } }; // 调用合并函数得到目标结果 const mergedResult = mergeIRBData(irbResult, consentResult); console.log(mergedResult);
注意事项
- 上述代码使用展开运算符做浅拷贝,不会修改原始的两个查询结果数据,如果IRB对象存在深层嵌套属性需要深拷贝,可将
{ ...matchedIRB }替换为structuredClone(matchedIRB)或者自定义深拷贝逻辑 - 没有匹配到对应IRB的节点,irb属性默认设为null,你可以根据业务需求调整为默认值,或者在遍历后过滤掉这部分节点
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

