javascript中用set去重数组最简洁高效,核心为[...new set(arr)];set天然存储唯一值,严格相等判断,对象按引用去重,nan视为同一值,时间复杂度o(n),优于传统o(n²)方法。

JavaScript 中用 Set 去重数组最简洁高效,核心就一行:[...new Set(arr)]。
为什么 Set 能天然去重
Set 是 ES6 引入的集合类型,只存储唯一值——相同值(严格相等)只会保留第一个。它不关心数据类型,数字、字符串、布尔值甚至对象引用都能存,但要注意:对象去重按引用判断,不是按内容。
-
new Set([1, 1, 2, 2])→{1, 2} -
new Set(['a', 'b', 'a'])→{'a', 'b'} -
new Set([{x:1}, {x:1}])→ 仍是两个对象(引用不同),不会去重
基础用法:一行转回数组
Set 本身不是数组,需用展开运算符或 Array.from() 转换:
const unique = [...new Set([1, 2, 2, 3])]; // [1, 2, 3]const unique = Array.from(new Set([1, 2, 2, 3])); // [1, 2, 3]
两种写法性能接近,展开运算符更常用、更直观。
处理复杂情况的小技巧
原生 Set 对象或 NaN 等特殊值有局限,可稍作适配:
- 字符串数组忽略大小写去重:先统一转小写映射,再还原
-
对象数组按某个字段去重(如 id):用
filter+Set记录已见的 key -
NaN 去重没问题:Set 把多个
NaN当作同一个值(这是 JS 规范行为)
例如按 id 去重对象:
const users = [{id:1,name:'A'}, {id:2,name:'B'}, {id:1,name:'C'}];<br>const seen = new Set();<br>const uniqueUsers = users.filter(item => !seen.has(item.id) && seen.add(item.id));
和传统方法对比优势在哪
相比 filter() + indexOf() 或双循环,Set 方案时间复杂度是 O(n),查找去重状态是常数时间;而传统方法是 O(n²)。尤其对千级以上数组,性能差距明显。代码也更短、可读性更高,没有副作用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











