ES6新增了Set类作为js的API的一部分,我们可以基于ES6的Set类开发我们自己的Set类.
先来看下原生的Set类怎么用.
const set =new Set()
set.add(1)
console.log(set.values());
console.log(set.has(1));//true
console.log(set.size);//1
set.delete(1)
console.log(set.size)//
看下控制台输出结果:
接下来看下ES6的Set类的运算:
其实ES6原生的Set并没有实现并集,交集,差集及子集等数学运算,不过我们可以模拟.
我们的例子会用到下面两个集合:
//创建两个集合
const setA = new Set()
setA.add(1)
setA.add(2)
setA.add(3)
const setB = new Set()
setB.add(2)
setB.add(3)
setB.add(4)
模拟并集运算
我们可以创建一个函数,来返回包含setA和setB中所有的元素的新集合.迭代这两个集合,把所有元素都添加到并集的集合中.代码如下:
//创建两个集合
const setA = new Set()
setA.add(1)
setA.add(2)
setA.add(3)
const setB = new Set()
setB.add(2)
setB.add(3)
setB.add(4)
//模拟并集运算
const union = (setA, setB) => {
const unionAb = new Set()
setA.forEach(value => unionAb.add(value));
setB.forEach(value => unionAb.add(value));
return unionAb;
}
console.log(union(setA, setB));
看下控制台输出结果:
模拟交集运算
模拟交集运算,需要创建一个辅助函数,来生成包含setA和setB共有元素的新集合.代码如下:
//模拟交集运算
const intersection = (setA, setB) => {
const intersectionSet = new Set()
setA.forEach(value => {
if(setB.has(value)){
intersectionSet.add(value)
}
});
return intersectionSet;
}
console.log(intersection(setA, setB));
看下控制台输出结果:
模拟差集运算
交集运算创建的集合包含setA和setB都有的元素,差集运算创建的集合则包含setA有而setB没有的元素.如下代码所示:
//模拟差集运算
const difference = (setA, setB) => {
const differenceSet = new Set()
setA.forEach(value => {
if(!setB.has(value)){
differenceSet.add(value)
}
});
return differenceSet;
}
console.log(difference(setA, setB));
看下控制台输出结果:
使用扩展运算符
(1)进行并集运算
//创建两个集合
const setA = new Set()
setA.add(1)
setA.add(2)
setA.add(3)
const setB = new Set()
setB.add(2)
setB.add(3)
setB.add(4)
//使用扩展运算符进行并集的运算
console.log(new Set([...setA, ...setB]));
效果是一样的:
(2)进行交集的运算
//使用扩展运算符进行交集的运算
console.log(new Set([...setA].filter(x=>setB.has(x))))
(3)进行差集的运算
//使用扩展运算符进行差集的运算
console.log(new Set([...setA].filter(x=>!setB.has(x))))