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

合并两个JSON文件并保留高值HighValue字段的最优方案

最优实现方案:合并JSON并保留高值条目

这个需求其实很常见,核心就是合并两个员工数组,对重复姓名的条目保留HighValue更高的记录,同时新增不存在的条目。最优的思路是利用键值对映射来快速定位重复项,避免低效的嵌套循环,具体实现步骤和代码如下:

核心思路

  1. 数组转键值对映射:用firstName作为唯一键,把员工对象存入映射(比如JS的Map、Python的字典),这样查找和更新重复项的时间复杂度是O(1),效率拉满。
  2. 遍历更新映射:对每个员工,若映射中无此姓名则直接添加;若已有,则比较HighValue(注意要转成数字,避免字符串比较的坑),保留数值更大的记录。
  3. 映射转回数组:最后把映射中的值提取为数组,包装成目标JSON结构。

这个方法的时间复杂度是O(m + n)(m、n为两个数组的长度),比嵌套循环的O(m*n)高效得多,数据量大时优势特别明显。

JavaScript 实现示例

// 定义两个输入JSON
const json1 = { "employees": [ { "firstName": "Tom", "HighValue": "3" }, { "firstName": "Maria", "HighValue": "4" }, { "firstName": "Robert", "HighValue": "45" } ] };
const json2 = { "employees": [ { "firstName": "Tom", "HighValue": "6" }, { "firstName": "Maria", "HighValue": "4" }, { "firstName": "Robert", "HighValue": "45" }, { "firstName": "John", "HighValue": "1" } ] };

function mergeEmployees(jsonA, jsonB) {
  const employeeMap = new Map();

  // 封装批量处理逻辑,避免重复代码
  function processEmployees(employees) {
    employees.forEach(emp => {
      const existingEmp = employeeMap.get(emp.firstName);
      if (!existingEmp) {
        // 无重复直接存入,浅拷贝避免修改原对象
        employeeMap.set(emp.firstName, {...emp});
      } else {
        // 转成数字比较HighValue,防止字符串比较出错
        const existingVal = parseInt(existingEmp.HighValue, 10);
        const newVal = parseInt(emp.HighValue, 10);
        if (newVal > existingVal) {
          employeeMap.set(emp.firstName, {...emp});
        }
      }
    });
  }

  // 依次处理两个JSON的员工数组
  processEmployees(jsonA.employees);
  processEmployees(jsonB.employees);

  // 映射转数组,返回最终结果
  return { employees: Array.from(employeeMap.values()) };
}

// 调用函数并打印结果
const mergedResult = mergeEmployees(json1, json2);
console.log(JSON.stringify(mergedResult, null, 2));

Python 实现示例

如果用Python处理,思路完全一致:

import json

# 定义两个输入JSON
json1 = { "employees": [ { "firstName": "Tom", "HighValue": "3" }, { "firstName": "Maria", "HighValue": "4" }, { "firstName": "Robert", "HighValue": "45" } ] }
json2 = { "employees": [ { "firstName": "Tom", "HighValue": "6" }, { "firstName": "Maria", "HighValue": "4" }, { "firstName": "Robert", "HighValue": "45" }, { "firstName": "John", "HighValue": "1" } ] }

def merge_employees(json_a, json_b):
    employee_dict = {}

    def process_employees(employees):
        for emp in employees:
            name = emp["firstName"]
            if name not in employee_dict:
                employee_dict[name] = emp.copy()
            else:
                current_val = int(employee_dict[name]["HighValue"])
                new_val = int(emp["HighValue"])
                if new_val > current_val:
                    employee_dict[name] = emp.copy()

    process_employees(json_a["employees"])
    process_employees(json_b["employees"])

    return {"employees": list(employee_dict.values())}

# 调用函数并打印结果
merged_result = merge_employees(json1, json2)
print(json.dumps(merged_result, indent=2))

关键注意点

  • 字符串转数字:原JSON中HighValue是字符串类型,必须转成数字再比较,否则会出现"10" < "2"的错误(字符串按字符ASCII码比较)。
  • 对象拷贝:用浅拷贝({...emp}/emp.copy())避免修改原输入对象,若员工对象有嵌套结构,可改用深拷贝(比如JS的JSON.parse(JSON.stringify(emp))、Python的copy.deepcopy())。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:20