合并两个JSON文件并保留高值HighValue字段的最优方案
最优实现方案:合并JSON并保留高值条目
这个需求其实很常见,核心就是合并两个员工数组,对重复姓名的条目保留HighValue更高的记录,同时新增不存在的条目。最优的思路是利用键值对映射来快速定位重复项,避免低效的嵌套循环,具体实现步骤和代码如下:
核心思路
- 数组转键值对映射:用
firstName作为唯一键,把员工对象存入映射(比如JS的Map、Python的字典),这样查找和更新重复项的时间复杂度是O(1),效率拉满。 - 遍历更新映射:对每个员工,若映射中无此姓名则直接添加;若已有,则比较
HighValue(注意要转成数字,避免字符串比较的坑),保留数值更大的记录。 - 映射转回数组:最后把映射中的值提取为数组,包装成目标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
相关产品推荐
相关产品推荐

