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

如何对比两个对象列表 按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:01:00