概念

Set是一个ES6新增的数据结构,本质是一种对象,可以用来存储多个数据,类似于数组,但是和数组的区别是元素不能重复。创建Set我们需要通过Set构造函数(暂时没有字面量创建的方式)

特点

  • 自动去重(原理是使用了Object.is()完成去重
    • 每次插入一个数据时,都会将其和set集合中已有的数据利用Object.is来进行判断,如果不一样,则插入到set集合中,如果一样则不管。
  • Set集合没有下标,本身数据的显示顺序跟插入顺序有关。
  • set集合可以保存任意类型的数据
  • set集合底层是由map集合来实现的,可以理解set集合是一个特殊的Map集合。

    使用

    1、创建

    1. //定义一个空的Set集合
    2. let 集合变量名 = new Set();
    3. //将某个数组的数据加入Set集合中(自动对数组进行去重)
    4. let 集合变量名 = new Set(数组名);

    2、添加数据 add()

    1. 集合变量名.add();
    2. //set集合支持链式调用
    3. 集合变量名.add().add().add();

    3、删除 delete()

    返回布尔型,表示是否删除成功
    1. 集合变量名.delete(数据);

    4、清空 clear()

    无返回值
    1. 集合变量名.clear();

    5、查看元素数量 size

    1. 集合变量名.size;

    6、判断是否有某个元素 has()

    返回布尔型
    1. 集合变量名.has(数据);

    7、遍历

    forEach-和数组一样

    1. 集合变量名.forEach(item => {
    2. console.log(item);
    3. });

    for…of

    ES6新增的用于遍历可迭代的对象的一种新的遍历方式。
    1. for (const item of 集合变量名) {
    2. console.log(item);
    3. }

    转换

    Set 转 Array

    1. let demo = new Set([1,2,3,4]);
    2. Array.from(demo)

    Array 转 Set

    1. let array = [1, 2, 3, 4];
    2. let set = new Set(array);

    应用

    1、去重

    1. let newArr = [...new Set(arr)];
    注意,引用类型的元素(数组、对象),储存的是内存地址,内存地址不同的视为不同的元素
    Set集合 - 图1
    上面2个空对象不是同一个元素,因此不会去重

    2、交集

    1. let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    2. let arr2 = [4, 5, 6, 5, 6];
    3. //方法一
    4. let result = [...new Set(arr)].filter(item => {
    5. let s2 = new Set(arr2);// [4,5,6]
    6. if (s2.has(item)) {
    7. return true;
    8. } else {
    9. return false;
    10. }
    11. });
    12. //方法二
    13. let result = [...new Set(arr)].filter(item => new Set(arr2).has(item));
    14. console.log(result);//[4, 5]

    3、并集

    1. let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    2. let arr2 = [4, 5, 6, 5, 6];
    3. let union = [...new Set([...arr, ...arr2])];
    4. console.log(union);//[1, 2, 3, 4, 5, 6]

    4、差集

    1. //差集是相对而言的,谁做主体,得到的结果不一样
    2. let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    3. let arr2 = [4, 5, 6, 5, 6];
    4. let diff1 = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
    5. console.log(diff1);//[1, 2, 3]
    6. let diff2 = [...new Set(arr2)].filter(item => !(new Set(arr).has(item)))
    7. console.log(diff2);//[6]