最简洁高效的去重方法是[...new Set(arr)],不修改原数组、保留首次出现顺序;对象数组需按字段(如id)配合filter和Set实现;支持NaN去重,但不支持深层对象相等判断。

用扩展运算符(...)配合 Set 是 JS 中最简洁、高效生成去重后全新数组的方法,一行就能搞定,且不修改原数组。
核心写法:直接用 [...new Set(arr)]
这是最常用也最推荐的方式。因为 Set 会自动去除重复值,而扩展运算符能把 Set 实例展开为真正的数组:
- 原数组保持不变 —— 不会改变输入的数组,完全符合“生成全新数组”的要求
-
保留首次出现顺序 ——
Set按插入顺序存储,所以去重后顺序和原数组一致 - 只支持基础类型和引用类型按内存地址判重 —— 对数字、字符串、布尔值等有效;对象/数组需额外处理
示例:
const uniqueArr = [...new Set(arr)];
// → [1, 2, 3, 'a', true]
处理对象数组去重(按某个字段)
扩展运算符 + Set 本身不能比较对象内容,但可以结合 map 提取唯一标识再去重:
- 先用
map提取关键字段(如id),生成临时键数组 - 用
Set去重这些键,再用filter配合indexOf或findIndex筛选原始对象
示例(按 id 去重):
const ids = new Set();
const uniqueUsers = users.filter(item => !ids.has(item.id) && ids.add(item.id));
兼容性与注意事项
该写法在现代浏览器和 Node.js(v4+)中都支持,但需注意:
-
NaN 能正确去重 ——
Set把多个NaN当作同一个值,这点比indexOf或includes更可靠 -
不区分
-0和+0—— 它们在Set中被视为相等 -
无法处理嵌套对象或函数的深层相等 —— 如需结构去重,得用 JSON 序列化(仅限可序列化数据)或第三方库如 Lodash 的
uniqBy


















