数据结构学习集合
集合是由一组无序且唯一(即不能重复)的项组成的数据结构,可以把集合想象成一个既没有重复元素,也没有顺序概念的数组。在数学中,集合是一组不同的对象(的集),并且有并集、交集、差集等基本操作。
ES6提供了Set对象用于表示集合,关于Set对象的基本操作可[移步于此](https://blog.86886.wang/posts/5b2324f88493c32a8e81fc99),接下来基于Set对象实现集合的扩展操作,即数学上的并集、交集、差集和子集
### 集合扩展操作
#### 并集
对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
![](https://cdn.86886.wang/blog/1539063081021.png)
```js
let union = function (setA, setB) {
let unionAb = new Set();
for (let x of setA) unionAb.add(x);
for (let x of setB) unionAb.add(x);
return unionAb;
}
```
#### 交集
对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。
![](https://cdn.86886.wang/blog/1539063088260.png)
```js
let intersection = function(setA, setB) {
let intersectionSet = new Set();
for (let x of setA) {
if (setB.has(x)) {
intersectionSet.add(x);
}
}
return intersectionSet;
};
```
#### 差集
对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
![](https://cdn.86886.wang/blog/1539063100822.png)
```js
let difference = function(setA, setB) {
let differenceSet = new Set();
for (let x of setA) {
if (!setB.has(x)) {
differenceSet.add(x);
}
}
return differenceSet;
}
```
#### 子集
验证一个给定集合是否是另一集合的子集
![](https://cdn.86886.wang/blog/1539063106789.png)
```js
let subset = function(setA, setB){
if (setA.size > setB.size){
return false;
} else {
for(let item of setA.values()) {
if (!setB.has(item)){
return false;
}
}
return true;
}
};
```
```js
let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
let setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
console.log(union(setA, setB).values()); // SetIterator {1, 2, 3, 4}
console.log(intersection(setA, setB).values()); // SetIterator {2, 3}
console.log(difference(setA, setB).values()); // SetIterator {1}
console.log(subset(setA, setB)); // false
```