最简洁的一行数组去重写法是[...new Set(array)];对对象数组需用[...new Map(array.map(item => [item.id, item])).values()]按指定字段去重。

用 Set 和扩展语法(...)去重数组,最简洁的一行写法是:
基础写法:数组去重
适用于普通数组(元素为原始值,如数字、字符串):
[...new Set(array)]
说明:
- new Set(array) 创建一个不含重复项的 Set 对象;
- [...] 将 Set 展开为新数组。
例如:
立即学习“Java免费学习笔记(深入)”;
const arr = [1, 2, 2, 3, 3, 4];<br> const unique = [...new Set(arr)]; // [1, 2, 3, 4]
处理对象数组(需自定义逻辑)
Set 无法直接对对象去重(因为对象引用不同即视为不同),不能单靠 [...new Set(arr)]。需要先提取唯一标识,再映射回原对象:
- 按某个字段(如
id)去重:
[...new Map(arr.map(item => [item.id, item])).values()]
说明:
- arr.map(...) 生成 [key, value] 键值对数组;
- new Map(...) 自动去重(相同 key 只保留最后一个);
- .values() 获取所有值,再用扩展语法转为数组。
注意事项
- 只适用于原始值或可安全用作 Map 键的属性(如字符串、数字、Symbol);
- 顺序保持原数组首次出现的顺序(Set 和 Map 都保持插入顺序);
- 不改变原数组,返回全新数组;
- NaN 和
0、-0的行为与严格相等一致(Set视NaN === NaN为 true,但0 === -0为 true)。
小技巧:封装成复用函数
如果频繁使用,可封装为一行箭头函数:
const uniq = arr => [...new Set(arr)];<br> const uniqById = arr => [...new Map(arr.map(v => [v.id, v])).values()];
调用时依然简洁:uniq([2,2,3]) 或 uniqById(list)。


















