ES6 Set数据结构

1.Set 是什么

Set是新的引用型的数据结构 它类似于数组,但是成员的值都是唯一 的,没有重复的值。

Set本身是一个构造函数,用来生成 Set 数据结构。

Set函数可以接受一个数组作为参数,用来初始化。

2.Set特性(重点概括)

重点

  • 1.成员不能重复
  • 2.属于引用数据类型,可以使用 set instanceof Set 或者 Object.prototype.toString.call(set)判断是否为Set类型
  • 3.可以通过Array.from(set)或者 扩展运算符 [...set]转为数组
  • 4.可以通过new Set(arr)进行数组去重
  • 5.Set的属性和方法 add(),has(),delete(),clear(), size属性
  • 6.引用数据类型比较的是地址是否相等,所以Set可以重复添加对象,因为不同对象地址不一样
  • 7.Set数据类型遍历:forEach(),for...of遍历
  • 8.通过Set实现数组的并集net Set([...arr1,...arr2])、交集(a转为Set,filter遍历b在a的Set中存在has())、差集(a转为Set,遍历b在a的Set中是否不存在)

3.Set基本用法

javascript 复制代码
const set = new Set([1, 2, 3, 4, 4]);
console.log(set); // Set(4) {1, 2, 3, 4}

4.怎么证明Set是新的引用类型的数据结构instanceof或者Object.prototype.toString.call(set)

先想一想 以前怎么判断是数组还是对象的?instanceof或者Object.prototype.toString.call(set)

javascript 复制代码
        let arr = [1,2,3];
        let obj = {
            a:1
        }

        console.log( arr instanceof Array);//true
        console.log( obj instanceof Object);//true
        console.log( Object.prototype.toString.call(arr));//[object Array]
        console.log( Object.prototype.toString.call(obj));//[object Object]

        let set = new Set([1,2,3,4]);
        console.log( set instanceof Set);//true
        console.log( Set.prototype.toString.call(set));//[object Set]

5.将Set数据类型转化成数组(通过扩展运算符[...set]或者 Array.from(set))

javascript 复制代码
        let set = new Set([1,2,3,4]);
        let arr1 = Array.from(set);
        let arr2 = [...set];
        console.log(arr1,arr2);//(4) [1, 2, 3, 4]

6.通过Set对数组去重 let arr1 = new Set(arr)

7.Set数据内部判断值的机制

  • Set数据内部判断值的机制:Set 内部判断两个值是否不同,使用的算法它类似于精确相等运算符(===),如5和"5"是两个不同的值
  • 特殊情况就是NaN的情况: 虽然NaN === NaN 返回false(其实NaN == NaN也会返回false),但是在Set数据内部认为相等
javascript 复制代码
        let set = new Set();
        let a = 5;
        let b = '5';
        set.add(a);
        set.add(b);
        
        console.log(Array.from(set))// [5, '5']

8.Set数据结构中两个对象总是不相等的。(因为{} === {} 返回false 其实 {}=={}也是返回false)

javascript 复制代码
let set = new Set();
set.add({});
set.add({});

console.log(...set);// 此时有两项 {} {}

9.set实例的属性和方法

  • 属性size
  • 方法 add() delete() has() clear()
  • 遍历方法forEach():Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

10.Set和展开运算符...实现数组的并集 交集 差集

javascript 复制代码
        let arr1 = [1, 2, 3]
        let arr2 = [4, 3, 2]
        // 实现交集
        console.log(new Set([...arr1, ...arr2]));//{1, 2, 3, 4}
        let c = new Set([...arr1, ...arr2]);
        let a = new Set(arr1); // 1,2,3
        let b = new Set(arr2); //4, 3, 2
        // 实现并集(has()方法和filter()方法结合) 
        console.log(new Set([...a].filter(a => b.has(a))));//{2, 3}
        // 实现差集(a对于b的差集和b对于a的差集不一样)
        console.log(new Set([...a].filter(item => !b.has(item))));// 1
        console.log(new Set([...b].filter(item => !a.has(item))));// 4
相关推荐
做人不要太理性7 天前
C++:基于红黑树封装map和set
开发语言·数据结构·c++·算法·set·map·红黑树
小柯J桑_16 天前
C++:set详解
c++·set
Trouvaille ~17 天前
【C++篇】跨越有限与无限的边界:STL之set容器中的自我秩序与无限可能
开发语言·数据结构·c++·容器·stl·set·红黑树
无双@1 个月前
初学C++高效容器 —— map和set
开发语言·c++·笔记·算法·stl·set·map
雷神乐乐1 个月前
JavaSE——集合6:Set接口实现类—LinkedHashSet
java·set·集合·linkedhashset
何政@2 个月前
JAVA中的集合有哪些???
java·list·set·map·queue·java集合类
DieSnowK2 个月前
[Redis][Set]详细讲解
数据库·redis·分布式·缓存·set·数据类型·新手向
Mike!2 个月前
C++进阶 set和map讲解
java·开发语言·数据结构·c++·set·map·cpp
wr168.c++3 个月前
【编程基础】跳房子
c++·算法·set·usaco
初级代码游戏3 个月前
github源码指引:共享内存、数据结构与算法:平衡二叉树set
github·set·平衡二叉树·共享内存