如何从数组中提取唯一重复元素并返回新数组

浅磊同学_5974

浅磊同学_5974

2026-01-16

719人浏览

原创

如何从数组中提取唯一重复元素并返回新数组

本文介绍如何正确提取数组中所有重复出现的元素,且每个重复值仅保留一次,避免多次输出同一重复项。

在 JavaScript 中,若需从一个数组中提取“所有重复出现过的值”,但要求结果数组中每个重复值仅出现一次(如 [1, 2, 3, 1, 5, 6, 1, 2, 5] 应返回 [1, 2, 5]),直接使用 filter() 配合 indexOf() 会导致重复项被多次捕获——因为 array.indexOf(item) !== index 对于第二个及之后的相同元素均成立(例如 1 在索引 3 和 6 处都会满足条件),从而输出 [1, 1, 2, 5]。

要实现「去重后的重复项」,核心思路是:先识别哪些元素出现了 ≥2 次,再确保结果中每个这样的元素只出现一次。以下是几种推荐的现代、可读性强且高效的实现方式:

✅ 方法一:使用 Set + filter + indexOf/lastIndexOf(简洁推荐)

const array = [1, 2, 3, 1, 5, 6, 1, 2, 5];

const duplicates = [...new Set(
  array.filter(item => array.indexOf(item) !== array.lastIndexOf(item))
)];

console.log(duplicates); // [1, 2, 5]

✅ 原理:indexOf(item) !== lastIndexOf(item) 表示该元素至少出现两次;外层 new Set() 自动去重,保证每个重复值只保留一次。

Java 接口排错助手
Java 接口排错助手

在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。

下载

✅ 方法二:使用 Map 统计频次(扩展性强,适合复杂场景)

const array = [1, 2, 3, 1, 5, 6, 1, 2, 5];

const countMap = new Map();
array.forEach(item => {
  countMap.set(item, (countMap.get(item) || 0) + 1);
});

const duplicates = [...countMap.entries()]
  .filter(([_, count]) => count > 1)
  .map(([item]) => item);

console.log(duplicates); // [1, 2, 5]

✅ 优势:逻辑清晰、易于调试,且便于后续扩展(如筛选出现 ≥3 次的元素)。

⚠️ 注意事项

  • ❌ 避免仅用 filter + indexOf(item) !== index:它会返回所有非首次出现的元素,而非「重复元素的集合」。
  • ✅ Set 是去重最安全的方式,尤其比手动遍历 indexOf 更高效、不易出错。
  • ? 若数组含对象或嵌套结构,需改用深比较逻辑(本文默认处理原始值:number/string/boolean)。
  • ? 推荐在生产环境使用方法一(简洁)或方法二(可维护),避免原问题中基于 for...in 的老旧写法(for...in 不适用于数组,易遍历原型链属性)。

总结

获取「唯一重复元素」的关键在于两步分离:检测重复性 → 去重结果。优先选用语义明确、性能可靠、符合现代 JS 规范的写法,既提升代码可读性,也避免隐式 bug。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6979

3

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2023.11.13

2150

6

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.30

163

8

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

670

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

533

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

303

6

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4696

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1395

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习