Set是ES6给开发者带来的一种新的数据结构,可以理解为值的集合。我们平时见到的数组Array也是一种数据结构,但是Set跟其他数据结构不同的地方就在于:它的值不会有重复项。
//1、创建出一个Set结构
var s = new Set();
console.log(s);//Set {}
//2、创建含内容的Set结构
var s = new Set([1,2,3]);
console.log(s);//Set {1, 2, 3}
//注意:
//1、Set 集合不会添加重复的成员。
//2、Set 构造函数可以接受所有可迭代对象作为参数。
//因此也出现了l两种数组去重的方法
[...new Set( [1,2,3,4,4] ) ]
//[1,2,3,4]
//或者
Array.from( new Set( [1,2,3,4,5,5] ) )
//[1,2,3,4,5]
Set实例的属性和方法
Set结构的实例有属性:
Set.prototype.constructor:构造函数,默认就是Set函数;
Set.prototype.size:返回Set实例的成员总数;
Set实例的方法分为两类:操作方法和遍历方法;
add(value):添加某个值,返回Set结构本身
//使用add方法添加成员
//Set集合里 (NaN===NaN) 为true
set.add(NaN).add(NaN);
s.add(1);
s.add(2);
s.add(3);
console.log(s);//Set {1, 2, 3,NaN}
delete(value):删除某个值,返回一个布尔值,表示删除是否成功;
//用数组作为参数初始化
var s = new Set([1,2,3]);
console.log(s);//Set {1, 2, 3}
//使用delete方法删除指定值
s.delete(2);//结果:true
s.delete(4);//结果:false
console.log(s);//Set {1, 3}
//我们使用delete( )方法删除了指定值:2,结果返回true。
//删除指定值:4的时候,返回false,原因是变量s中找不到数字4。
has(value):返回一个布尔值,表示该值是否为Set的成员;
var s = new Set([1,2,3]);
s.has(1);//true
s.has(4);//false
clear() :清除所有成员,没有返回值;
var s = new Set([1,2,3]);
console.log(s);//Set {1, 2, 3}
s.clear();
console.log(s);//Set {}
entries( )方法:返回一个键值对的遍历器。
var s = new Set(['a','b','c']);
s.entries(); //结果:SetIterator {["a", "a"], ["b", "b"], ["c", "c"]}
//注意得到的结果,成员值“a”对应的键值对是[“a”,”a”],也就是说:Set结构是键名和键值是同一个值。
keys( ) 和 values( ) 方法
keys( )方法:返回键名的遍历器。
values( )方法:返回键值的遍历器。
var s = new Set(['a','b','c']);
s.keys(); /SetIterator {"a", "b", "c"}
s.values();//SetIterator {"a", "b", "c"}
遍历方法
for…of 循环
Set 集合默认可遍历,因此可以直接用for…of循环遍历 Set 集合,会依次返回集合的成员。
for (let item of new Set(["A", "B"])) {
console.log(item);
}
//输出:A B
forEach() 方法对集合中的每一个成员运行给定函数。这个方法没有返回值,可以替代for…of循环使用。该方法的回调函数中一共有三个参数,依次为成员、索引值和集合本身。但由于Set 集合没有索引值的概念,因此第一个参数与第二个参数的值永远都是一样的。
new Set([1, 2, 3]).forEach((v, i, s) => console.log(v + ":" + i));
//1:1 2:2 3:3
Set集合的用处前面说了一个数组去重
Set 集合和filter() 方法相结合可以很容易地实现数组的并集、交集和差集。
const arr1 = [1, 2, 3],
arr2 = [3, 4, 5];
//数组并集
console.log([...new Set([...arr1, ...arr2])]);
//输出:[1, 2, 3, 4, 5]
//数组交集
const cross = [...new Set(arr1)].filter(item => arr2.indexOf(item) >= 0)
console.log(cross)
//输出:[3]
//数组差集
console.log([...new Set([...arr1,...arr2])].filter(item=> cross.indexOf(item) < 0))
//输出:[1, 2,4, 5]