集合
集合(不重复)的项组成。集合和没有重复项的组成的,用花括号{}包裹;还有一种概念叫空集,空集就是不包括任何元素的集合。
集合封装
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;}values() {return Object.values(this.items);}// 交集:返回两个集合中共用元素的新集合// 差集:返回存在第一个集合并且不存在第二个集合中的新集合// 子集:验证一个集合是否是另一个集合的子集}
集合间操作
- 并集:对于给定的两个集合,返回一个包含两个集合中
所有元素的新集合 - 交集:对于给定的两个集合,返回一个包含两个集合中
共有元素的新集合 - 差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的新集合
- 子集:验证一个给定的集合是否是另一个集合的子集,验证一个集合里面所有元素是否都存在于另一个集合中,有一个不是就返回false
并集
并集:返回两个集合中所有元素的新集合
union(otherSet) {const set = new Set();// 自己的集合this.values().forEach(value => set.add(value));// 传入的集合otherSet.values().forEach(value => set.add(value));return set.values();}const set1 = new Set();const set2 = new Set();set1.add('a');set1.add('b');set2.add('b');set2.add('c');const newSet = set1.union(set2);console.log(newSet); // (3) ["a", "b", "c"]
交集
交集:返回两个集合中共用元素的新集合
intersection(otherSet){const intersectionSet = new Set();const values = this.values();for (let i = 0; i < values.length; i++) {// 传入的集合中有自己集合中这个项的话在插入数据if(otherSet.has(values[i])){intersectionSet.add(values[i])}}return intersectionSet;}const intersection =set1.intersection(set2);console.log(intersection.values()); // ['b']
差集
差集:返回存在第一个集合并且不存在第二个集合中的新集合
// 差集和交集其实一样,唯一不同就是取反就能得到差集difference(otherSet){const differenceSet = new Set();this.values().forEach(element => {if(!otherSet.has(element)){differenceSet.add(element)}})return differenceSet}const difference = set1.difference(set2);console.log(difference.values()); // ['a']
子集
子集:验证一个集合是否是另一个集合的子集
验证一个集合里面所有元素 是否都存在另一个集合中(有一个不是就返回 false)
isSubsetOf(otherSet){// 自己元素需要 大于 传入长度;if(this.size() > otherSet.size()){return false;}let isSbuset = true; // 假设当前实例是给定集合的子集;this.values().every(value => {if(!otherSet.has(value)){isSbuset = false;return false;}return true;})return isSbuset;}const set1 = new Set();const set2 = new Set();set1.add('a');set1.add('b');set2.add('b');// 验证set2里面所有元素是否都存在set1中const isSubsetOf = set2.isSubsetOf(set1);console.log(isSubsetOf); // true
原生Set模拟
const set1 = new Set();const set2 = new Set();set1.add(1)set1.add(2)set1.add(3)set2.add(2)set2.add(3)set2.add(4)// 并集const union = (set1,set2) => {const newSet = new Set();set1.forEach(element => {newSet.add(element)});set2.forEach(element =>{newSet.add(element)})return newSet;}const unionResult = union(set1,set2);console.log(unionResult); // Set(4) {1, 2, 3, 4}// 交集const intersection = (set1,set2)=>{const newSet = new Set();set1.forEach(element => {if(set2.has(element)){newSet.add(element)}})return newSet;}const inter = intersection(set1,set2)console.log(inter);// 差集const difference = (set1,set2)=>{const newSet = new Set();set1.forEach(element => {if(!set2.has(element)){newSet.add(element)}})return newSet;}const diff = difference(set1,set2)console.log(diff);
es6模拟
// 并集console.log(new Set([...set1,...set2]));// 交集console.log(new Set([...set1].filter(element => set2.has(element))));// 差集console.log(new Set([...set1].filter(element => !set2.has(element))));
