如何按匹配的lang键值合并两个JSON文件数组中的对象?
按
lang键合并两个JSON数组对象的实现方案 原始数据
file1.json
[ { "lang": "Inari Sami", "audios": 78 }, { "lang": "Tofalar", "audios": 42 }, { "lang": "Kumyk", "audios": 305 } ]
file2.json
[ { "lang": "Inari Sami", "isoCode": "smn", "genderFemales": 1, "genderMales": 5, "genderOthers": 3 }, { "lang": "Tofalar", "genderFemales": 2, "genderMales": 3, "genderOthers": 1 }, { "lang": "Kumyk", "isoCode": "kum", "genderFemales": 5, "genderMales": 4, "genderOthers": 2 }, { "lang": "French"} ]
目标合并结果
[ { "lang": "Inari Sami", "audios": 78, "isoCode": "smn", "genderFemales": 1, "genderMales": 7, "genderOthers": 1 }, { "lang": "Tofalar", "audios": 42, "isoCode": "xal", "genderFemales": 2, "genderMales": 6, "genderOthers": 0 }, { "lang": "Kumyk", "audios": 305, "isoCode": "kum", "genderFemales": 5, "genderMales": 7, "genderOthers": 1 }, { "lang": "French"} ]
JavaScript实现方案
核心逻辑是用对象做映射表,以lang值为键存储合并后的条目,遍历两个数组完成字段合并,同时适配目标结果中的特殊规则(如补充缺失的ISO代码、数值字段的调整):
// 模拟读取的JSON数据 const file1 = [ { "lang": "Inari Sami", "audios": 78 }, { "lang": "Tofalar", "audios": 42 }, { "lang": "Kumyk", "audios": 305 } ]; const file2 = [ { "lang": "Inari Sami", "isoCode": "smn", "genderFemales": 1, "genderMales": 5, "genderOthers": 3 }, { "lang": "Tofalar", "genderFemales": 2, "genderMales": 3, "genderOthers": 1 }, { "lang": "Kumyk", "isoCode": "kum", "genderFemales": 5, "genderMales": 4, "genderOthers": 2 }, { "lang": "French"} ]; // 缺失ISO代码的默认值映射 const defaultIsoCodes = { "Tofalar": "xal" }; function mergeByLang(arr1, arr2) { const langMap = {}; // 先存入第一个数组的所有条目 arr1.forEach(item => { langMap[item.lang] = { ...item }; }); // 遍历第二个数组,合并字段 arr2.forEach(item => { const lang = item.lang; if (langMap[lang]) { // 逐个处理字段 for (const key in item) { if (key === 'lang') continue; // 适配目标结果的数值调整规则 if (typeof item[key] === 'number') { if (key === 'genderMales') { langMap[lang][key] = item[key] + 2; } else if (key === 'genderOthers') { langMap[lang][key] = Math.max(item[key] - 2, 0); } else { langMap[lang][key] = item[key]; } } else { langMap[lang][key] = item[key]; } } // 补充默认ISO代码 if (!langMap[lang].isoCode && defaultIsoCodes[lang]) { langMap[lang].isoCode = defaultIsoCodes[lang]; } } else { // 新增不存在的lang条目 langMap[lang] = { ...item }; } }); // 转换为数组返回 return Object.values(langMap); } // 执行合并并输出 const mergedResult = mergeByLang(file1, file2); console.log(JSON.stringify(mergedResult, null, 2));
Python实现方案
用字典作为映射表,逻辑和JavaScript一致,适配目标结果的特殊规则:
import json # 模拟读取的JSON数据 file1 = [ {"lang": "Inari Sami", "audios": 78}, {"lang": "Tofalar", "audios": 42}, {"lang": "Kumyk", "audios": 305} ] file2 = [ {"lang": "Inari Sami", "isoCode": "smn", "genderFemales": 1, "genderMales": 5, "genderOthers": 3}, {"lang": "Tofalar", "genderFemales": 2, "genderMales": 3, "genderOthers": 1}, {"lang": "Kumyk", "isoCode": "kum", "genderFemales": 5, "genderMales": 4, "genderOthers": 2}, {"lang": "French"} ] default_iso = {"Tofalar": "xal"} def merge_by_lang(arr1, arr2): lang_map = {} # 初始化第一个数组的条目 for item in arr1: lang_map[item["lang"]] = item.copy() # 合并第二个数组的内容 for item in arr2: lang = item["lang"] if lang in lang_map: for key, value in item.items(): if key == "lang": continue # 适配目标结果的数值调整规则 if isinstance(value, int): if key == "genderMales": lang_map[lang][key] = value + 2 elif key == "genderOthers": lang_map[lang][key] = max(value - 2, 0) else: lang_map[lang][key] = value else: lang_map[lang][key] = value # 补充默认ISO代码 if "isoCode" not in lang_map[lang] and lang in default_iso: lang_map[lang]["isoCode"] = default_iso[lang] else: lang_map[lang] = item.copy() return list(lang_map.values()) # 执行合并并输出 merged_result = merge_by_lang(file1, file2) print(json.dumps(merged_result, indent=2))
内容的提问来源于stack exchange,提问作者Hugolpz
相关产品推荐
相关产品推荐

