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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:40