JS中高效对比对象数组并筛选差异的实现方案
高效对比库存数组差异的实现方案
嵌套循环的核心问题是时间复杂度为O(n²),当数组包含数千个对象时,运算量会飙升至百万级别,性能表现极差。我们可以通过哈希映射(Map/Object)将整体时间复杂度优化到O(n+m)(n、m分别为新旧数组的长度),具体实现思路如下:
核心思路
- 构建旧数据哈希索引:以
artnr和affiliateid的组合作为唯一键(这两个字段联合标识一个唯一库存项),将旧数据中的stock值存入Map,后续查找时间复杂度为O(1)。 - 遍历新数据筛选差异:对新数据中的每个项生成相同的唯一键,通过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
相关产品推荐
相关产品推荐

