ES6 Set集合用法

场景:

近期在开发一个桌面的收银系统,开发过程中遇到这个一个问题,在用户购买完产品之后选择使用购物卡进行支付的时候,由于购物卡分很多种类,包括通用,酒水卡,日用品卡(类似优惠券的使用范围限制的问题),如何判断用户购买的产品是否可以使用当前的购物卡进行支付呢?

首先想到的是使用集合的概念,就是ES6里面的Set结构。

集合是什么意思?

集合(Set)是由一组无序但彼此之间又有一定关系性的成员构成,每个成员在集合中只能出现一次,不同于我们之前说的字典,链表之类的,它是一种包含了不同元素的数据结构。

对于集合的常见操作有在中学里面学到的子集空集等概念。

交集:将两个集合中共同存在的成员组成的一个新的集合
并集:将两个集合中的成员进行合并,得到一个新的集合
补集:属于一个集合而不属于另一个集合的成员组成的新的集合
子集:一个集合(A)内的所有元素等同于另一个集合(B)或者能够在另一个集合(B)里面找到该集合的所有元素,那么这个集合(A)就是集合(B)的子集

1.如何定义一个集合?

let s = new Set() ;
[ 2 , 3 , 5 , 4 , 5 , 2 ].foreach( x => s.add(x) ) ;

console.log(s)//(2,3,4,5)

2.交,并,补操作

let a = new Set([1, 2, 3]);
let b = new Set([3, 5, 2]);

// 并集
let unionSet = new Set([...a, ...b]);
console.log("并集",unionSet)//[1,2,3,5]

// 交集
let intersectionSet = new Set([...a].filter(x => b.has(x)));
console.log("交集",intersectionSet)// [2,3]

// ab差集
let differenceABSet = new Set([...a].filter(x => !b.has(x)));
console.log("差集",differenceABSet)// [1]

3.子集,根据上面子集的定义,那么如何判断a是不是b的子集呢?
A:假如a和b的并集没有产生新的元素,即unionSet.size == a.size || unionSet.size == b.size,那么说明a是b的子集。
B:遍历所有的a集合,判断b集合里面是否有a的所有成员,如果有那么说明a是b的子集。

//A 假设判断a是不是b的子集
if(unionSet.size == b.size)
    console.log('a是b的子集')     
}

//B
let flag = false;
for(let item of b.values()){
    if(a.has(item)){
       flag = true;
    }
}
if (flag) {
   console.log('a是b的子集')
}
else {
   console.log('a不是b的子集')
}

笔者认为这里采用方法A效率更高,当集合元素变得很多的时候,采用遍历的方法效率就会降低。如果有其他更好的方法,欢迎提出。

附:
set的属性和方法:
1.Set.prototype.constructor:构造函数,默认就是Set函数;
2.Set.prototype.size:返回Set实例的成员总数。

Set实例的方法:
1.add(value):添加某个值,返回Set结构本身。
2.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
3.has(value):返回一个布尔值,表示该值是否为Set的成员。
4.clear():清除所有成员,没有返回值。

Set遍历的方法:
1.keys():返回键名的遍历器
2.values():返回键值的遍历器
3.entries(),返回键值对的遍历器
4.clear():使用回调函数遍历每个成员

猜你喜欢

转载自blog.csdn.net/xjl271314/article/details/78822306
今日推荐