如何提取对象数组中SalseVersion和MarketingCode重复的元素?
如何从对象数组中提取SalesVersion和MarketingCode同时重复的元素
首先,咱们先明确需求:要找出数组中所有**SalseVersion和MarketingCode组合完全重复**的对象,而且这两个属性的值可以是字符串、数字或者布尔类型。
先说说你现有代码的问题
你的代码没得到正确结果,主要有几个坑:
- 拼写错误:数组里的属性是
SalseVersion,但你代码里写成了SalesVersion(多了个a),这会导致属性读取失败,永远无法匹配到相等的情况。 - 默认
sort()对对象数组无效:JavaScript默认的sort()方法不会按照对象的属性排序,它只是按对象的引用或者toString后的结果排序,所以排序后的数组里相邻元素根本不一定是同组合的对象。 - 只比较相邻元素会遗漏重复项:就算排序正确,这种方式也只能找到连续的重复项,要是重复元素被其他元素隔开,或者同一组合出现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
相关产品推荐
相关产品推荐

