前端 —— JavaScript 进阶 27 -- ES6 之 set

数据结构:

        数据结构就是储存数据的结构 如:数组、对象。

       常见的数据结构: 栈  队列  树 图 集合...。这次来说说 ES6 新增的数据结构 Set 和 Map

 

Set:

很多数据放在一起,没有重复项 。

它类似于数组,允许存储任何类型的值,无论是原始值或者是对象引用,但成员的值都是唯一的,没有重复的值。

语法:

var mySet = new Set();

Set 实例的属性和方法如下。

  • add(value):添加某个值,返回Set结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功
  • has(value):返回一个布尔值,表示该值是否为Set的成员
  • clear():清除所有成员,没有返回值
  • size : 集合里元素的个数

Set结构的实例有四个遍历方法,可以用于遍历成员。

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

注意:

** Set结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。

** Set的遍历顺序就是插入顺序。

我们来逐个看下实例:

【 实例 1 】利用这一唯一特性进行数组的去重工作

//单一数组的去重。
let mySet = new Set([1,2,2,3,3])
console.log(mySet); //Set { 1, 2, 3 }

//多数组的合并去重
let arr01 = [2,3,4,4,5];
let arr02 = [1,2,4,6,5,7];
let mySet02 = new Set([...arr01,...arr02])
console.log(mySet02);//Set { 2, 3, 4, 5, 1, 6, 7 }
let res = [...mySet02];
console.log(res);//[ 2, 3, 4, 5, 1, 6, 7 ]

【 实例 2 】size 集合里元素的个数

//size 集合里元素的个数
let mySet03 = new Set(['a','b','c']);
console.log(mySet03.size);// 3 

【 实例 3 】add(value)  向Set中添加元素。

//add(value)向Set中添加元素。
let addSet = new Set();
    addSet.add(1);
    addSet.add(2);
    addSet.add(3);
console.log('add',addSet);//add Set { 1, 2, 3 }
console.log(addSet.size); //3

【 实例 4 】delete(value)  从Set中删除元素。

//delete(value)从Set中删除元素。
let delSet = new Set();
    delSet.add(1);
    delSet.add(2);
    delSet.add(3);
    delSet.delete(1);
console.log('deleted',delSet);//deleted Set { 2, 3 }

【 实例 5 】has(value)  判断某元素是否存在。

//has(value)判断某元素是否存在。
let hasSet = new Set();
    hasSet.add(1);
    hasSet.add(2);
    hasSet.add(3);
    hasSet.delete(1); 
console.log('has(1):',hasSet.has(1));//has(1): false
console.log('has(2):',hasSet.has(2));//has(2): true

【 实例 6 】clear() 清除所有成员。

//clear()清除所有成员。
let clearSet = new Set();
    clearSet.add(1);
    clearSet.add(2);
    clearSet.add(3);    
console.log('add',clearSet);//add Set { 1, 2, 3 }
    clearSet.clear(); // 清除所有成员
console.log('clear:',clearSet);//clear: Set {}

Set 和 Array 之间相互转换

【 实例 7 】 数组 转 Set集合

let arrset = new Set([1,2,3,4,5])
console.log(arrset)//Set { 1, 2, 3, 4, 5 }

【 实例 8 】 Set集合 转 数组

//Set集合 转 数组
let setArr = new Set([11,22,33,44]);
console.log([...setArr])//[ 11, 22, 33, 44 ]

【 实例 9 】 forEach()  方法对数组的每个成员执行一次提供的函数

//遍历迭代 循环数组中的每一项。
let forSet = new Set([1,2,3])
console.log(forSet.size);//3

forSet.forEach(function(item){
    console.log(item); 
});
// 1 
// 2 
// 3

集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型

    用上面提到的的函数方法来实现交集并集的效果

    数组的 map filter 方法也可以间接用于Set了,因此使用Set可以很容易地实现并集、交集和差集。

【 实例 10 】 并集 [11,22,33]  [22,33,44,55]  于两个给定集合A、B,由两个集bai合所有元素构成的集合

//并集 [11,22,33]  [22,33,44,55]  于两个给定集合A、B,由两个集bai合所有元素构成的集合
let arr03 = [11,22,33];
let arr04 = [22,33,44,55];
let r = [...arr03,...arr04];
let res = new Set(r);
console.log(res);//Set { 11, 22, 33, 44, 55 }
let uion = [...res];
console.log(uion);//[ 11, 22, 33, 44, 55 ]

【 实例 11 】交集 两个数组都有的元素  两个给定集合A、B,由属于A又属于B的所有元素构成的集合

//交集 两个数组都有的元素  两个给定集合A、B,由属于A又属于B的所有元素构成的集合
//对 arr05做循环,判断其里面的值在arr06中有没有
let arr05 = [11,22,33,22,22];
let arr06 = [22,33,44,55];
let jjSet01 = new Set(arr05);//数组去重
let jjSet02 = new Set(arr06);
let  intersect = [...jjSet01].filter(function(item){
    //console.log(item);
   return jjSet02.has(item);
})
console.log(intersect);//[ 22, 33 ]

【 实例 12 】差集  A,B是两个集合,则所有属于A且不属于B的元素构成的集合

//差集  A,B是两个集合,则所有属于A且不属于B的元素构成的集合
//对 arr06做循环,判断其里面的值在arr07中有没有,没有就是差集
let arr07 = [11,22,33,22,22];
let arr08 = [22,33,44,55];
let cj01 = new Set(arr07);
let cj02 = new Set(arr08);
let diff = [...cj01].filter(function(item){
    return !cj02.has(item)
})
console.log(diff); //[ 11 ]

 webSet

WeakSet结构与Set类似,也是不重复的值的集合

       WeakSet的成员只能是对象,而不能是其他类型的值,WeakSet可以接受一个数组或类似数组的对象作为参数。

        WeakSet是一个构造函数,可以使用new命令,创建WeakSet数据结构。

语法:

let wset = new WeakSet();

 WeakSet结构有以下三个方法。

  • add(value):添加一个新成员。
  • delete(value):清除指定成员。
  •  has(value):表示某个值是否在,返回一个布尔值。
const ws = new WeakSet();
const obj = {};
const foo = {};
ws.add(obj);
ws.has(foo);    // false
//WeakSet 没有size属性,没有办法遍历它的成员。
ws.size // undefined
ws.forEach // undefined
ws.forEach(function(item){ console.log('WeakSet has ' + item)})
// TypeError: undefined is not a function

关于WeakSet()的其他知识点,大家可以自己查资料哦!

下一篇再谈谈 Map

我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值