Array.from(new Set(arr))是JavaScript中简洁高效的数组去重方法,利用Set自动去重并保持顺序,再转为数组;对象数组需按属性手动去重;支持NaN相等判断,但区分类型。

用 Set 配合 Array.from 去重,是 JavaScript 中简洁又高效的数组去重方式,核心在于利用 Set 自动过滤重复值的特性,再将其转回数组。
基本写法:一行搞定基础去重
Set 会自动丢弃重复项,且保持原始顺序;Array.from 能把类数组或可迭代对象(比如 Set)转成真数组:
const arr = [1, 2, 2, 3, 4, 4, 5]; const uniqueArr = Array.from(new Set(arr)); // → [1, 2, 3, 4, 5]
处理对象数组:需手动提取唯一标识
Set 对对象按引用比较,直接传入对象数组不会去重。常见做法是先提取 key(如 id),再用 Map 或过滤逻辑辅助:
- 按
id去重(保留第一个):
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' }
];
const seen = new Set();
const uniqueUsers = users.filter(item => {
if (seen.has(item.id)) return false;
seen.add(item.id);
return true;
});
// → [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
- 如果坚持用
Array.from + Set风格,可先映射出 id 数组,再关联原数据(适合简单场景):
const ids = Array.from(new Set(users.map(u => u.id))); const uniqueUsers = ids.map(id => users.find(u => u.id === id));
兼容性与替代写法
Array.from 和 Set 在 ES6+ 环境中可用(现代浏览器和 Node.js ≥ 0.12)。若需兼容旧环境:
- 用扩展运算符替代
Array.from:[...new Set(arr)](更简短,效果相同) - IE 不支持
Set或扩展运算符时,退回filter + indexOf或使用reduce
注意点:类型与 NaN 的特殊行为
Set 认为 NaN 等于 NaN(这是它比 === 更合理的点),所以:
Array.from(new Set([NaN, NaN, 1])) // → [NaN, 1],不是 [NaN, NaN, 1]
同时,1 和 '1' 视为不同值,类型敏感:
Array.from(new Set([1, '1', 1])) // → [1, '1']
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











