基本语法
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值(对于基本类型来说)。Set 本身是一个构造函数,用来生成 Set 数据结构。
const set = new Set();
[2, 3, 3, 3].forEach(x => set.add(x));
for(let i of set){
console.log(i); // [2, 3]
}
上面代码通过add
方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复的值。可以在构造函数中直接传入数组初始化(注意:只能传数组,不然会报错),和上面方法效果相同
var set = new Set([2, 3, 3, 3]);
[...set] // [2, 3]
set.size // 2
所以上面发现了一种去除数组去重的方法
var arr = [2, 3, 3, 3];
var new_arr = [...new Set(arr)]; // [2, 3]
再谈去重
向Set加入值的时候,不会发生类型转换,所以5和”5”是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===),我们知道在js中判断对象相等,不能通过==
和===
{x:2, y:2} == {x:2, y:2} // false
{x:2, y:2} === {x:2, y:2} // false
对象通过指针指向的内存中的地址来做比较,所以要判断对象是否相等,只能通过遍历去判断,这其中包含了很多边际情况。所以set没有去判断这些,只要往里面扔一个对象,那么就是一个新的元素
var set = new Set();
var obj1 = {};
var obj2 = {};
set.add(obj1);
for(let i of set){
console.log(i); // Object {}
}
set.add(obj2);
for(let i of set){
console.log(i); // Object {} Object {}
}
而js中比较出名的,和任何值都不相等的NaN(not a number)
NaN == NaN // false
NaN === NaN // false
Set中加入了对NaN的判断
var set = new Set();
set.add(NaN);
set.size // 1
set.add(NaN);
set.size // 1
说明NaN在set的判断中是相等的,所以set支持了所有基本类型
Set的基本操作
- add(value) :添加某个值,返回Set结构本身
- delete(value) : 删除某个值,返回一个布尔值,表示删除是否成功
- has(value):返回一个布尔值,表示该值是否是Set的成员
- clear() :清除所有成员,没有返回值
下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同。
var prop = {
name: 'sysuzhyupeng',
age: 24
}
//注意要加引号
if('name' in prop){
}
//Set的写法
var prop = new Set();
prop.add('name');
prop.add('age');
if(prop.has('name')) ...
Array.from方法可以将Set结构转为数组。
var set = new Set([1, 2, 3, 4, 5]);
var arr = Array.from(set);
所以,由于set转化成数组有上述这两种方式,所以数组去重都可以用这两个方法。