如何在JavaScript数组中查找重复元素?附代码及运行结果
在JavaScript数组中查找重复元素的几种实用方法
嘿,我来帮你梳理下在JavaScript数组里查找重复元素的几种实用方法~
方法1:用对象统计元素出现次数
这种方法逻辑清晰,适合处理大多数常规类型的数组元素,通过统计每个元素的出现次数,筛选出重复项:
function findDuplicates(arr) { const countMap = {}; const duplicates = []; // 遍历数组统计次数 for (const item of arr) { countMap[item] = (countMap[item] || 0) + 1; } // 筛选出出现次数大于1的元素 for (const key in countMap) { if (countMap[key] > 1) { duplicates.push(key); } } return duplicates; } // 示例调用 const testArr = [1, 2, 2, 3, 4, 4, 4, 5]; console.log(findDuplicates(testArr)); // 输出: ["2", "4"]
注意:如果数组里存在不同类型的“相同值”(比如数字2和字符串"2"),会被当成不同元素统计;如果需要忽略类型,可以用String(item)作为对象的键。
方法2:Set + filter 简洁实现
利用Set自动去重的特性,结合filter找出那些在数组中首次出现索引不等于当前索引的元素,最后再用Set去重得到唯一的重复项列表:
function findDuplicates(arr) { // filter找出所有重复出现的元素,再用Set去重得到唯一的重复项 return [...new Set(arr.filter((item, index) => arr.indexOf(item) !== index))]; } // 示例调用 const testArr = ['Monday', 'Tuesday', 'Sunday', 'Monday', 'Tuesday']; console.log(findDuplicates(testArr)); // 输出: ["Monday", "Tuesday"]
这个写法非常简洁,但indexOf会遍历数组,所以处理超大数组时性能不如第一种方法。
方法3:用Map处理复杂类型元素
如果你的数组里包含对象、Symbol这类复杂类型的元素,用Map会比普通对象更靠谱,因为Map支持任意类型的键:
function findDuplicates(arr) { const countMap = new Map(); const duplicates = []; for (const item of arr) { countMap.set(item, (countMap.get(item) || 0) + 1); } // 遍历Map筛选重复项 for (const [key, value] of countMap) { if (value > 1) { duplicates.push(key); } } return duplicates; } // 示例调用 const obj1 = { name: 'Alice' }; const obj2 = { name: 'Bob' }; const testArr = [obj1, obj2, obj1, obj2, obj1]; console.log(findDuplicates(testArr)); // 输出: [ { name: 'Alice' }, { name: 'Bob' } ]
另外,顺带提一下你附带的howManySundays代码,看起来你原本是想计算给定天数内有多少个周日,但目前的逻辑没有用到传入的startDay,也没统计周日的数量。如果需要修正的话,可以参考这个写法:
function howManySundays(num, startDay) { const Days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]; // 找到起始日期在数组中的索引 const startIndex = Days.indexOf(startDay); let sundayCount = 0; for(let i = 0 ; i < num ; i++){ const currentDayIndex = (startIndex + i) % 7; if(Days[currentDayIndex] === 'Sunday'){ sundayCount++; } } return sundayCount; } console.log(howManySundays(9,"Sunday")); // 输出: 2(第1天和第8天是周日)
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

