Array.from(new Set(arr)) 是最简洁、兼容性好且语义清晰的数组去重方法,利用 Set 自动去重和 Array.from 转换可迭代对象的特性,适用于基本类型;对对象数组需按字段手动去重。

直接用 Array.from(new Set(arr)) 就行,这是最简洁、兼容性好且语义清晰的写法。
为什么这样能去重?
Set 是 ES6 新增的数据结构,它只允许存储唯一值,重复添加的值会被自动忽略。
而 Array.from() 可以把任何可迭代对象(包括 Set)转换成数组。
基础用法示例
比如有一个含重复项的数组:
const arr = [1, 2, 2, 3, 4, 4, 5];<br>const uniqueArr = Array.from(new Set(arr));<br>console.log(uniqueArr); // [1, 2, 3, 4, 5]
处理更复杂的数据类型
注意:Set 对象、数组等引用类型仍按内存地址判断是否重复,所以对对象数组不能直接去重:
- ✅ 基本类型(数字、字符串、布尔值):天然支持
- ❌ 对象/数组:每个都是新引用,
Set不会认为它们重复
如果要对对象数组去重(如按 id 字段),得先提取键值再处理,例如:
const users = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 1, name: 'c'}];<br>const ids = new Set();<br>const uniqueUsers = users.filter(user => {<br> if (ids.has(user.id)) return false;<br> ids.add(user.id);<br> return true;<br>});
和其它去重方式对比
-
[...new Set(arr)]:更短,但本质一样,是扩展运算符 + Set 的写法 -
arr.filter((item, i) => arr.indexOf(item) === i):兼容老浏览器,但性能差(O(n²)) -
arr.reduce()或Map:适合需要额外逻辑的场景,但代码更长
日常开发中,Array.from(new Set(arr)) 是平衡可读性、性能和兼容性的首选。











