如何通过ID匹配从三个JSON中提取字段生成新JSON?
用JS/jQuery实现多JSON列表按标识匹配合并
嘿,我来帮你搞定这个需求!既然你熟悉jQuery和JS,完全可以用原生JS(jQuery在这场景下其实没太多必要,不过如果你的数据是通过jQuery Ajax获取的,也能无缝衔接)来实现,思路其实很清晰,分三步走:
核心思路
- 预处理数据,提升匹配效率:因为是大型JSON列表,直接嵌套循环匹配会很慢,所以先把第二个和第三个列表转成「以
article_id为键」的映射对象,这样后续查找只需要O(1)的时间。 - 遍历主列表,匹配合并:以第一个列表(用
id作为唯一标识)为基础,遍历每个元素,通过id去映射对象里找对应的第二个、第三个列表的元素。 - 组装目标结构:把需要的字段从三个匹配到的元素中提取出来,拼成你想要的新JSON结构。
代码实现(带详细注释)
假设你已经通过接口或本地文件拿到了三个JSON字符串,先把它们解析成JS对象数组(如果是用jQuery的$.getJSON获取的,已经是解析好的对象了):
// 示例数据(实际替换成你的大型JSON数组) const list1 = [ { "id":"265", "title":"Battle of Gettysburg", "page_id":"4849", "language_id":"en", "original_time":"July 1–3, 1863" }, // ...更多元素 ]; const list2 = [ { "id":"185", "original_name":"United States", "country_id":"24", "article_id":"265" }, // ...更多元素 ]; const list3 = [ { "id":"73", "month":"July", "year":"1863", "suffix":"", "article_id":"265" }, // ...更多元素 ]; // 第一步:把list2转成article_id -> 元素的映射 const list2Map = list2.reduce((acc, current) => { acc[current.article_id] = current; return acc; }, {}); // 同样处理list3 const list3Map = list3.reduce((acc, current) => { acc[current.article_id] = current; return acc; }, {}); // 第二步:遍历list1,生成目标数组 const mergedResult = list1.map(item => { // 通过item.id匹配list2和list3的元素,没匹配到就用空对象避免报错 const matchedList2Item = list2Map[item.id] || {}; const matchedList3Item = list3Map[item.id] || {}; // 组装你需要的结构 return { id: item.id, title: item.title, original_name: matchedList2Item.original_name || '', // 可选:没匹配到给空字符串 year: matchedList3Item.year || '' }; }); // 如果需要把结果转成JSON字符串,用下面的代码 const mergedJson = JSON.stringify(mergedResult, null, 2); console.log(mergedJson);
补充说明
- 性能优化:用
reduce生成映射是关键,尤其是处理大型数组时,能把时间复杂度从O(n*m)降到O(n),避免页面卡顿。 - 边界处理:代码里加了
|| {}和|| '',是为了防止某个id在list2或list3中没有对应项时出现undefined,你可以根据实际需求调整默认值(比如改成null)。 - jQuery适配:如果你的数据是通过
$.getJSON获取的,只需要把获取到的数组赋值给list1、list2、list3即可,其他代码完全通用。
内容的提问来源于stack exchange,提问作者rob.m
相关产品推荐
相关产品推荐

