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

如何提取对象数组中SalseVersion和MarketingCode重复的元素?

如何从对象数组中提取SalesVersion和MarketingCode同时重复的元素

首先,咱们先明确需求:要找出数组中所有**SalseVersion和MarketingCode组合完全重复**的对象,而且这两个属性的值可以是字符串、数字或者布尔类型。

先说说你现有代码的问题

你的代码没得到正确结果,主要有几个坑:

  1. 拼写错误:数组里的属性是SalseVersion,但你代码里写成了SalesVersion(多了个a),这会导致属性读取失败,永远无法匹配到相等的情况。
  2. 默认sort()对对象数组无效:JavaScript默认的sort()方法不会按照对象的属性排序,它只是按对象的引用或者toString后的结果排序,所以排序后的数组里相邻元素根本不一定是同组合的对象。
  3. 只比较相邻元素会遗漏重复项:就算排序正确,这种方式也只能找到连续的重复项,要是重复元素被其他元素隔开,或者同一组合出现3次以上,都会漏掉部分结果。

正确的解决方案:统计组合出现次数后筛选

这里推荐用Map来统计每个SalseVersion + MarketingCode组合的出现次数,再遍历原数组筛选出次数大于1的元素。这种方法能支持所有原始类型的属性值,还能保留原数组的顺序,不会遗漏任何重复项。

代码示例:

const arr = [
  { name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
  { name: "Suresh", SalseVersion: 12, MarketingCode: 13 },
  { name: "Siva", SalseVersion: 10, MarketingCode: 14 },
  { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 },
  // 测试不同类型的情况
  { name: "John", SalseVersion: "v2", MarketingCode: true },
  { name: "Jane", SalseVersion: "v2", MarketingCode: true }
];

// 第一步:统计每个属性组合的出现次数
const countMap = new Map();
arr.forEach(item => {
  // 用JSON.stringify生成唯一键,区分不同类型的相同值(比如数字10和字符串"10")
  const comboKey = JSON.stringify([item.SalseVersion, item.MarketingCode]);
  countMap.set(comboKey, (countMap.get(comboKey) || 0) + 1);
});

// 第二步:筛选出出现次数>1的元素
const duplicateItems = arr.filter(item => {
  const comboKey = JSON.stringify([item.SalseVersion, item.MarketingCode]);
  return countMap.get(comboKey) > 1;
});

console.log(duplicateItems);

为什么这个方法可行?

  • 支持多类型值:JSON.stringify能把不同类型的属性值序列化成不同的字符串,比如[10, true]和["10", true]会生成不一样的键,避免把不同类型的相同值误判为重复。
  • 无遗漏统计:不管重复元素在数组中的位置如何,都能准确统计每个组合的出现次数。
  • 保留原顺序:筛选过程是遍历原数组,所以结果数组的元素顺序和原数组一致。

测试你给出的示例2时,这个代码会正确返回两组重复的所有4个元素,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:58:26