Array.from 配合 Set 去重是最简洁高效的方式,利用 Set 自动去重特性再转为数组,支持原始值及 NaN 去重,保持顺序,语义清晰且性能优。

用 Array.from 配合 Set 去重,是 JavaScript 中最简洁、高效的方式之一。核心逻辑是:利用 Set 自动去重的特性构造集合,再用 Array.from 把它转回数组。
为什么 Set 能去重?
Set 是一个只允许存储唯一值的集合类型,重复添加相同值时会被自动忽略。它不比较引用(对对象仍会视为不同),但对原始值(如数字、字符串、布尔值)能准确识别重复。
- 支持所有基本类型:
1、"a"、true等不会重复 - 对
NaN也友好——Set认为多个NaN是同一个值(ES6 行为) - 注意:对象、数组等引用类型仍按内存地址判断,所以
[1]和[1]会被视为两个不同元素
标准写法:Array.from(Set) 一行搞定
直接把原数组传给 Set 构造函数,再用 Array.from 转换:
const arr = [1, 2, 2, 3, 3, 4]; const unique = Array.from(new Set(arr)); // → [1, 2, 3, 4]
这比 [...new Set(arr)] 多了一层明确性,语义更清晰,且在需要传入映射函数时更灵活(见下一条)。
立即学习“Java免费学习笔记(深入)”;
进阶用法:去重 + 映射(比如统一转小写)
Array.from 第二个参数可以传一个映射函数,适合在去重同时做简单转换:
const arr = ["Apple", "banana", "APPLE", "Banana"]; const uniqueLower = Array.from( new Set(arr.map(item => item.toLowerCase())), item => item ); // → ["apple", "banana"]
或者更紧凑地写成:
const uniqueLower = Array.from( new Set(arr.map(String.toLowerCase)), x => x );
注意:不能直接在 Set 构造时做映射,必须先 map 再建 Set,否则去重依据还是原始值。
和其它方法对比的关键优势
相比 filter + indexOf 或 reduce,这种组合更短、更易读、性能更好(Set 插入和查找平均是 O(1)):
- 无需手写循环或回调逻辑
- 天然保持原始顺序(
Set遍历时按插入顺序) - 兼容性好:现代浏览器和 Node.js 6+ 均支持
- 代码意图一目了然——“从一个去重后的集合创建数组”


















