在JavaScript里,Set是一种内置的集合对象,它的特点就是每一项都是唯一的,重复的值会被自动忽略。借助这个特性,我们可以非常方便地完成数组去重操作,而不需要像以前那样写多层循环和判断。
一、最基础的Set去重写法
把数组作为参数传给Set的构造函数,就能得到一个去重后的集合,再用扩展运算符或Array.from把它变回数组即可。
// 原始数组包含重复数字 const arr = [1, 2, 2, 3, 3, 3, 4]; // 使用Set去重并转回数组 const uniqueArr = [...new Set(arr)]; console.log(uniqueArr); // 输出 [1, 2, 3, 4]
二、使用Array.from的替代方式
如果不习惯写扩展运算符,也可以用Array.from方法把Set对象转换成数组,效果完全一致。
const list = ['a', 'b', 'a', 'c', 'b']; const result = Array.from(new Set(list)); console.log(result); // 输出 ['a', 'b', 'c']
三、去重时的相等判断规则
Set判断重复使用的是严格相等(===),所以下面这些情况需要留意:
- 数字1和字符串'1'被视为不同的值,不会去重。
- NaN在Set中被视为等于自身,所以多个NaN也只保留一个。
- 对于对象类型,只有引用同一个地址才会被认为是重复。
const obj = { id: 1 };
const mixed = [obj, obj, { id: 1 }];
const afterUnique = [...new Set(mixed)];
console.log(afterUnique.length); // 输出 2,因为第三个对象是新的引用
四、处理引用类型数据的技巧
如果数组里是对象,并且想根据某个字段去重,可以借助Map或者先提取关键值再处理。
const users = [
{ id: 1, name: 'Tom' },
{ id: 2, name: 'Jane' },
{ id: 1, name: 'Tom' }
];
// 根据id去重
const seen = new Set();
const uniqueUsers = users.filter(item => {
if (seen.has(item.id)) {
return false;
}
seen.add(item.id);
return true;
});
console.log(uniqueUsers.length); // 输出 2
五、小结
利用Set集合做数组去重,代码简洁且性能较好,适合处理基本类型组成的一维数组。遇到对象数组时,可以配合filter与Set记录已出现的关键字段来实现灵活去重。理解Set基于严格相等的特性,能帮我们避开常见的数据误判问题。
JavaScriptSet数组去重修改时间:2026-07-26 16:36:28