Set去重最简洁高效,核心是利用其自动忽略重复值特性再转数组;基础写法为[...new Set(arr)]或Array.from(new Set(arr)),适用于原始值和相同引用,对象需配合Map或filter实现按字段去重。

用 Set 去重是最简洁、高效的方式,核心就一句话:利用 Set 自动忽略重复值的特性,再转回数组。
基础写法:一行搞定
这是最常用也最推荐的方法:
const uniqueArr = [...new Set(arr)]- 或等价写法:
Array.from(new Set(arr))
两者都先创建一个 Set 实例(自动去重),再通过扩展运算符或 Array.from 转为数组。性能好、可读性强,适用于大多数场景。
注意:只对原始值和相同引用有效
Set 判断“重复”的依据是 SameValueZero 算法,这意味着:
立即学习“Java免费学习笔记(深入)”;
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 数字
0和-0被视为不同(但实际多数情况下影响不大) -
NaN和NaN被视为相同(这点比===更合理) - 对象、数组等引用类型:只有同一引用才被当作重复;
[1,2]和[1,2]是两个不同元素,不会去重
如果需要深比较去重(比如去重对象数组),Set 本身做不到,得配合 JSON.stringify 或自定义逻辑。
处理对象数组的常见思路
若想按某个字段(如 id)去重,可以用 Map 配合 Set 思路:
const uniqueByField = Array.from(new Map(arr.map(item => [item.id, item])).values())- 或更清晰的写法:
const seen = new Set(); const unique = arr.filter(item => { if (seen.has(item.id)) return false; seen.add(item.id); return true; });
这种写法保留了原数组顺序,且只遍历一次,效率高,适合中大型数据。
兼容性与小提示
Set 在 ES6 中引入,现代浏览器和 Node.js(≥ v0.12)均支持。如需兼容老环境(如 IE),可用 filter + indexOf 回退,但性能差很多。
另外,Set 本身不保证插入顺序?错——Set 是有序结构,遍历时按插入顺序返回,所以去重后数组顺序和原数组首次出现顺序一致。

















