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

如何按匹配的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:44:57