javascript中set去重最快,因其底层基于哈希表,插入和查找均为o(1);推荐写法为[...new set(arr)],简洁高效,支持基本类型及nan,但不适用于对象深比较。

JavaScript 中用 Set 去重最高效的方式是直接用 Array.from(new Set(arr)) 或展开运算符 [...new Set(arr)],两者性能接近,后者更简洁常用。
为什么 Set 去重最快?
Set 是 ES6 内置的集合类型,底层基于哈希表实现,插入和查找时间复杂度均为 O(1)。相比 filter() + indexOf()(O(n²))或 reduce() 手动维护数组(需多次遍历),Set 一次性遍历原数组即可完成去重,无重复比较开销。
推荐写法:展开运算符(最常用)
代码简洁、可读性强,现代浏览器和 Node.js 环境支持良好:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const unique = [...new Set(arr)];
- 适用于基本类型(
string、number、boolean、null、undefined、Symbol) - 对
NaN也有效(Set认为唯一一个NaN) - 不处理对象或数组等引用类型(因为它们内存地址不同,默认不重复)
处理对象数组的去重(按指定字段)
Set 本身不能直接去重对象,但可结合 Map 或临时键提取实现高效去重:
const uniqueBy = (arr, key) => Array.from(new Map(arr.map(item => [item[key], item])).values());
- 例如:
uniqueBy([{id:1},{id:2},{id:1}], 'id')→[{id:1},{id:2}] - 利用
Map键唯一性,避免嵌套循环,时间复杂度为 O(n) - 比
filter() + findIndex()更快,尤其在大数据量时优势明显
注意事项和边界情况
-
Set会自动过滤NaN重复项,但NaN !== NaN,而Set内部特殊处理使其只保留一个 -
0和-0在Set中被视为不同值(符合 IEEE 754 规范) - 如果需要深比较对象,
Set不适用,应改用序列化(如JSON.stringify)或专用库(如 Lodash 的uniqBy) - V8 引擎对
[...new Set(arr)]有专门优化,实测比Array.from(new Set(arr))略快,但差异微小,可忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










