用set实现集合的交并补差子集
class Set {
constructor() {
this.items = {};
}
has(element) {
// return element in this.items;
return Object.prototype.hasOwnProperty.call(this.items, element);
}
add(element) {
if (!this.has(element)) {
this.items[element] = element; //好特别捏
return true;
}
return false;
}
delete(element) {
if (this.has(element)) {
delete this.items[element];
return true;
}
return false;
}
clear() {
this.items = {};
}
size() {
return Object.keys(this.items).length;
// let count = 0;
// for (let key in this.items) {
// if (this.items.hasOwnProperty(key)) {
// count++;
// }
// }
// return count;
}
values() {
return Object.values(this.items);
// let values = [];
// for (let key in this.items) {
// if (this.items.hasOwnProperty(key)) {
// values.push(key);
// }
// }
// return values;
}
union(otherSet) {
const unionSet = new Set();
this.values().forEach((value) => unionSet.add(value));
otherSet.values().forEach((value) => unionSet.add(value));
return unionSet;
}
intersection(otherSet) {
const intersectionSet = new Set(); // {1}
const values = this.values(); // {2}
const otherValues = otherSet.values(); // {3}
let biggerSet = values; // {4}
let smallerSet = otherValues; // {5}
if (otherValues.length - values.length > 0) {
// {6}
biggerSet = otherValues;
smallerSet = values;
}
smallerSet.forEach((value) => {
// {7}
if (biggerSet.includes(value)) {
intersectionSet.add(value);
}
});
return intersectionSet;
}
difference(otherSet) {
const differenceSet = new Set();
this.values().forEach((value) => {
if (!otherSet.has(value)) {
//A-B 在A但不在B里的元素
differenceSet.add(value);
}
});
return differenceSet;
}
isSubsetOf(otherSet) {
if (this.size() > otherSet.size()) {
return false;
}
let isSubset = true;
this.values().every((value) => {
if (!otherSet.has(value)) {
isSubset = false;
return false;
}
return true;
});
return isSubset;
}
}