一维数组找重复元素有四种方法:①哈希统计(对象/map计数);②set边遍历边收集;③indexof与lastindexof判断;④set去重后filter筛选。各法适用场景不同,需据数据类型与性能要求选择。

要找一维数组里的重复元素,核心是“记录已见,识别再遇”。不靠排序、不依赖额外库,用哈希思想最直接有效。
用对象或Map统计出现次数
遍历数组时,把每个元素当作键,出现次数当作值存进对象或Map。结束后筛选出次数大于1的键即可。
- 对象适合简单数据类型(数字、字符串),如 obj[num] = (obj[num] || 0) + 1
- Map更健壮,能正确处理 null、undefined、对象等,且不会因原型链干扰
- 注意:严格相等(===)判断下,0 和 -0 被视为不同,NaN 会被统一视为同一键(Map 的特性)
边遍历边收集重复项(去重+标记)
如果只需找出哪些元素重复,不要求频次,可用一个集合(Set)记录已见过的元素,遇到第二次就加入结果数组。
- 初始化空 seen = new Set() 和空 duplicates = []
- 对每个元素 item,若 seen.has(item) 为真,推入 duplicates;否则调用 seen.add(item)
- 此法天然去重——同一个重复元素只记录一次,比如 [1,1,1,2,2] 返回 [1,2]
利用 indexOf 和 lastIndexOf 快速判断(小数组适用)
对每个元素,检查它第一次和最后一次出现的位置是否不同。位置不同说明至少出现两次。
- 写法简洁:arr.indexOf(item) !== arr.lastIndexOf(item)
- 适合长度较小、性能要求不高的场景;时间复杂度 O(n²),大数组慎用
- 注意:该方法会为每个重复元素多次触发判断,需配合 filter((item, i) => arr.indexOf(item) === i) 去重后再检验
ES6 Set + filter 实现一行式提取(语义清晰)
借助 Set 去重前后长度差异,结合 filter 提取重复项,代码紧凑且易读。
- const duplicates = [...new Set(arr)].filter(item => arr.indexOf(item) !== arr.lastIndexOf(item))
- 本质仍是双遍历,但封装性好,适合快速验证逻辑
- 若原数组含对象或函数,需自定义比较逻辑,此时应改用 Map 或循环比对属性











