登录
首页 >  文章 >  前端

Set轻松实现数组去重方法详解

时间:2026-05-14 08:30:46 327浏览 收藏

本文深入解析了利用 ES6 中 Set 数据结构实现数组去重的最轻量、高效且原生的方法——`[...new Set(arr)]`,不仅阐明其底层依赖 SameValueZero 比较规则对基础类型按值、引用类型按地址自动去重的原理,还直击实际开发痛点:明确指出该方法对对象数组无效的原因,并提供基于 Map 或 reduce 的字段级去重方案;同时兼顾实用性,提醒 null/undefined 防御处理、字符串去重技巧,并对比性能与兼容性——在现代环境下单次遍历 O(n) 的卓越效率远超传统 filter + indexOf,是前端开发者必须掌握的简洁利器。

如何利用 Set 极其简单地实现数组去重:[...new Set(arr)]

[...new Set(arr)] 去重,本质是利用 Set 只保留唯一值的特性,再通过扩展运算符转回数组。它简洁、原生、无需额外库,是目前最轻量的去重方式。

为什么 Set 能天然去重

Set 是 ES6 引入的数据结构,它的设计原则就是“成员值唯一”——相同值(基于 SameValueZero 比较规则)只会存一份。无论是数字、字符串,还是引用类型(注意:对象/数组按内存地址判断),Set 都自动过滤重复项。

  • 基础类型(如 1, 'a', true)完全按值去重
  • 引用类型(如 {}、[])按引用去重,不是按内容
  • NaN 和 0 的特殊处理:Set 中 NaN 只保留一个,+0 和 -0 被视为相同

基本写法与注意事项

直接展开即可,但要注意输入必须是可迭代对象(数组、类数组、字符串等):

const arr = [1, 2, 2, 3, '3', '3', NaN, NaN];
const unique = [...new Set(arr)]; // [1, 2, 3, '3', NaN]
  • 不能对 null 或 undefined 直接使用,会报错
  • 如果 arr 是 null,先做防御性检查:arr && [...new Set(arr)]
  • 字符串也能用:[...new Set('abac')]['a','b','c']

处理对象数组的常见误区

直接用 [...new Set(objArr)] 不会按对象内容去重,因为每个对象字面量都是新引用:

const users = [{id: 1}, {id: 1}, {id: 2}];
[...new Set(users)]; // ❌ 仍是三个对象,没去重

若需按字段去重,得先提取 key(如 id),再配合 Map 或 reduce:

  • 简单方案:用 Map 记录已见 id:Array.from(new Map(users.map(o => [o.id, o])).values())
  • 或用 reduce:users.reduce((acc, cur) => acc.some(u => u.id === cur.id) ? acc : [...acc, cur], [])

性能与兼容性提醒

对于数万以内元素,[...new Set(arr)] 性能优秀,时间复杂度 O(n);远优于 filter + indexOf 的 O(n²)。

  • 兼容性:现代浏览器和 Node.js 6+ 均支持,IE 完全不支持
  • 如需兼容老环境,可用 Babel 转译,或退化为 Array.from(new Set(arr))(效果一致)
  • 超大数据量(如百万级)时,Set 内存开销略高,可考虑分块或流式处理

终于介绍完啦!小伙伴们,这篇关于《Set轻松实现数组去重方法详解》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>