如何对比两个对象列表 按gtin匹配后合并对应键值生成新列表
实现方案
核心思路是先对List2做预处理,构建gtin -> 对应localized值的快速查询映射,再遍历List1做字段拼接,相比嵌套循环的写法时间复杂度更低,数据量大时性能优势明显。
JavaScript 实现代码
// 1. 预处理List2,构建gtin和localized的映射表 const gtinMap = new Map() for (const item of List2) { // 按样例结构,每个元素的specifications数组取第一项的localized const localizedVal = item.specifications?.[0]?.localized if (item.gtin && localizedVal) { gtinMap.set(item.gtin, localizedVal) } } // 2. 遍历List1组装目标结果 const result = List1.reduce((acc, cur) => { const matchLocalized = gtinMap.get(cur.gtin) // 仅保留匹配成功的项 if (matchLocalized) { acc.push({ localized: matchLocalized, amount: cur.amount, modificationDate: cur.modificationDate }) } return acc }, [])
Python 实现代码
# 1. 预处理List2构建映射 gtin_map = {} for item in list2: if item.get("gtin") and item.get("specifications"): gtin_map[item["gtin"]] = item["specifications"][0].get("localized") # 2. 遍历List1生成结果 result = [] for item in list1: match_localized = gtin_map.get(item["gtin"]) if match_localized: result.append({ "localized": match_localized, "amount": item["amount"], "modificationDate": item["modificationDate"] })
逻辑说明
- 预处理阶段把List2的单条查询复杂度从O(n)降到O(1),整体时间复杂度从嵌套循环的
O(m*n)优化到O(m+n),两个列表长度越长,性能提升越明显 - 代码默认加了空值兼容:如果List2中某条数据的specifications为空、或者List1中的gtin在List2中无匹配,会自动跳过,不会生成带undefined/None的无效字段
- 上述代码生成的是全新的结果数组,不会修改原始List1、List2的数据;如果需要直接修改原List1,遍历List1时直接给元素加localized属性、再删除gtin属性即可
注意:如果你的业务场景中specifications数组存在多个元素,需要根据实际业务规则取对应项的localized值,上述代码默认取数组第一个元素,和你给出的样例结构保持一致。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

