最简洁的数组去重方式是[...new set(arr)],适用于原始类型且保持插入顺序;对象数组需结合map或set按属性去重;多数组合并去重可链式书写;嵌套数组需序列化辅助。

用扩展运算符结合 Set 是目前最简洁、可读性最强的数组去重方式,一行就能搞定,且天然支持基本类型去重。
基础去重:[...new Set(arr)]
这是现代 JavaScript 中最常用、最推荐的写法。原理是利用 Set 的唯一性自动过滤重复项,再用扩展运算符展开为新数组。
- 适用场景:元素为数字、字符串、布尔值等原始类型
-
保持顺序:是的,
Set遍历时按插入顺序返回,结果数组顺序与原数组首次出现顺序一致 -
示例:
const arr = [1, 2, 2, 3, 1]; const unique = [...new Set(arr)]; // [1, 2, 3]
对象数组去重:需配合 map 或 reduce
扩展运算符本身不能直接对对象去重(因为对象引用不同即视为不同),但可以和辅助结构组合实现按属性去重。
-
按单个字段去重(如 id):
const uniqueById = Array.from(new Map(arr.map(item => [item.id, item])).values()); -
更清晰的写法(推荐):
const seen = new Set(); const unique = arr.filter(item => !seen.has(item.id) && seen.add(item.id)); - 注意:这里扩展运算符不直接参与去重,但后续若需浅拷贝或合并,仍可无缝接入,比如
[...unique, ...otherItems]
多数组合并 + 去重:一步到位
如果要去重的数据来自多个来源,可先合并再统一去重,语义清晰、链式自然。
const a = [1, 2, 3]; const b = [2, 3, 4]; const c = [3, 4, 5];const allUnique = [...new Set([...a, ...b, ...c])]; // [1, 2, 3, 4, 5]- 比传统
concat().filter()或多次Set操作更直观,也避免中间数组冗余
去重后保留原始结构(如嵌套数组)
如果数组里含子数组,而你想对顶层元素去重(子数组作为整体判断),Set 默认不支持——因为数组是引用类型。这时需先转成可比字符串,或用 JSON.stringify 辅助(仅限简单结构)。
const arr = [[1,2], [3,4], [1,2]]; const unique = [...new Map(arr.map(v => [JSON.stringify(v), v])).values()];- 更健壮的做法是封装成函数,避免重复逻辑;扩展运算符在此仍负责最终展开,保持接口一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











