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

JS中高效对比对象数组并筛选差异的实现方案

高效对比库存数组差异的实现方案

嵌套循环的核心问题是时间复杂度为O(n²),当数组包含数千个对象时,运算量会飙升至百万级别,性能表现极差。我们可以通过哈希映射(Map/Object)将整体时间复杂度优化到O(n+m)(n、m分别为新旧数组的长度),具体实现思路如下:

核心思路

  1. 构建旧数据哈希索引:以artnr和affiliateid的组合作为唯一键(这两个字段联合标识一个唯一库存项),将旧数据中的stock值存入Map,后续查找时间复杂度为O(1)。
  2. 遍历新数据筛选差异:对新数据中的每个项生成相同的唯一键,通过Map快速获取对应旧库存值,对比后筛选出库存有变化的项。

代码实现(TypeScript版本)

// 假设StockUpdate.stockMqttResponse是已定义的类型
interface StockUpdate {
  stockMqttResponse: {
    artnr: number;
    affiliateid: number;
    stock: number;
  }
}

const FilterObjectDiff = (oldData: StockUpdate.stockMqttResponse[], newData: StockUpdate.stockMqttResponse[]) => {
  // 构建旧数据的库存映射表
  const oldStockMap = new Map<string, number>();
  oldData.forEach(item => {
    const uniqueKey = `${item.artnr}-${item.affiliateid}`;
    oldStockMap.set(uniqueKey, item.stock);
  });

  // 筛选出库存有变化的新数据项
  return newData.filter(item => {
    const uniqueKey = `${item.artnr}-${item.affiliateid}`;
    const oldStock = oldStockMap.get(uniqueKey);
    // 仅保留存在旧记录且库存值不同的项
    return oldStock !== undefined && oldStock !== item.stock;
  });
};

测试验证

用示例数据测试:

const oldData = [
  { artnr: 12, affiliateid: 1, stock: 10 },
  { artnr: 12, affiliateid: 2, stock: 15 },
  { artnr: 12, affiliateid: 3, stock: 1 },
  { artnr: 13, affiliateid: 2, stock: 2 }
];

const newData = [
  { artnr: 12, affiliateid: 1, stock: 11 },
  { artnr: 12, affiliateid: 2, stock: 20 },
  { artnr: 12, affiliateid: 3, stock: 1 },
  { artnr: 13, affiliateid: 2, stock: 2 }
];

console.log(FilterObjectDiff(oldData, newData));
// 输出:[{ artnr: 12, affiliateid: 1, stock: 11 }, { artnr: 12, affiliateid: 2, stock: 20 }]

扩展说明

  • 如果需要包含新增的库存项(旧数据中不存在的新项),可将筛选条件修改为:
    return oldStock === undefined || oldStock !== item.stock;
    
  • 若担心字符串拼接性能,也可以用数组作为Map的键(Map支持非字符串键):
    const uniqueKey = [item.artnr, item.affiliateid];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:13:17