概念
Set是一个ES6新增的数据结构,本质是一种对象,可以用来存储多个数据,类似于数组,但是和数组的区别是元素不能重复。创建Set我们需要通过Set构造函数(暂时没有字面量创建的方式)
特点
- 自动去重(原理是使用了
Object.is()完成去重- 每次插入一个数据时,都会将其和set集合中已有的数据利用
Object.is来进行判断,如果不一样,则插入到set集合中,如果一样则不管。
- 每次插入一个数据时,都会将其和set集合中已有的数据利用
- Set集合没有下标,本身数据的显示顺序跟插入顺序有关。
- set集合可以保存任意类型的数据
- set集合底层是由map集合来实现的,可以理解set集合是一个特殊的Map集合。
使用
1、创建
//定义一个空的Set集合let 集合变量名 = new Set();//将某个数组的数据加入Set集合中(自动对数组进行去重)let 集合变量名 = new Set(数组名);
2、添加数据 add()
集合变量名.add();//set集合支持链式调用集合变量名.add().add().add();
3、删除 delete()
返回布尔型,表示是否删除成功集合变量名.delete(数据);
4、清空 clear()
无返回值集合变量名.clear();
5、查看元素数量 size
集合变量名.size;
6、判断是否有某个元素 has()
返回布尔型集合变量名.has(数据);
7、遍历
forEach-和数组一样
集合变量名.forEach(item => {console.log(item);});
for…of
ES6新增的用于遍历可迭代的对象的一种新的遍历方式。for (const item of 集合变量名) {console.log(item);}
转换
Set 转 Array
let demo = new Set([1,2,3,4]);Array.from(demo)
Array 转 Set
let array = [1, 2, 3, 4];let set = new Set(array);
应用
1、去重
注意,引用类型的元素(数组、对象),储存的是内存地址,内存地址不同的视为不同的元素let newArr = [...new Set(arr)];

上面2个空对象不是同一个元素,因此不会去重2、交集
let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];let arr2 = [4, 5, 6, 5, 6];//方法一let result = [...new Set(arr)].filter(item => {let s2 = new Set(arr2);// [4,5,6]if (s2.has(item)) {return true;} else {return false;}});//方法二let result = [...new Set(arr)].filter(item => new Set(arr2).has(item));console.log(result);//[4, 5]
3、并集
let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];let arr2 = [4, 5, 6, 5, 6];let union = [...new Set([...arr, ...arr2])];console.log(union);//[1, 2, 3, 4, 5, 6]
4、差集
//差集是相对而言的,谁做主体,得到的结果不一样let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];let arr2 = [4, 5, 6, 5, 6];let diff1 = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));console.log(diff1);//[1, 2, 3]let diff2 = [...new Set(arr2)].filter(item => !(new Set(arr).has(item)))console.log(diff2);//[6]
