集合

集合(不重复)的项组成。集合和没有重复项的组成的,用花括号{}包裹;还有一种概念叫空集,空集就是不包括任何元素的集合。

集合封装

  1. class Set {
  2. constructor() {
  3. this.items = {};
  4. }
  5. has(element) {
  6. return element in this.items;
  7. return Object.prototype.hasOwnProperty.call(this.items, element);
  8. }
  9. add(element) {
  10. if (!this.has(element)) {
  11. this.items[element] = element;
  12. return true;
  13. }
  14. return false;
  15. }
  16. delete(element) {
  17. if (!this.has(element)) {
  18. delete this.items[element]
  19. return true;
  20. }
  21. return false;
  22. }
  23. clear() {
  24. this.items = {};
  25. }
  26. size() {
  27. return Object.keys(this.items).length;
  28. }
  29. values() {
  30. return Object.values(this.items);
  31. }
  32. // 交集:返回两个集合中共用元素的新集合
  33. // 差集:返回存在第一个集合并且不存在第二个集合中的新集合
  34. // 子集:验证一个集合是否是另一个集合的子集
  35. }

集合间操作

  • 并集:对于给定的两个集合,返回一个包含两个集合中 所有元素 的新集合
  • 交集:对于给定的两个集合,返回一个包含两个集合中 共有元素 的新集合
  • 差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的新集合
  • 子集:验证一个给定的集合是否是另一个集合的子集,验证一个集合里面所有元素是否都存在于另一个集合中,有一个不是就返回false

image.png

并集

并集:返回两个集合中所有元素的新集合

  1. union(otherSet) {
  2. const set = new Set();
  3. // 自己的集合
  4. this.values().forEach(value => set.add(value));
  5. // 传入的集合
  6. otherSet.values().forEach(value => set.add(value));
  7. return set.values();
  8. }
  9. const set1 = new Set();
  10. const set2 = new Set();
  11. set1.add('a');
  12. set1.add('b');
  13. set2.add('b');
  14. set2.add('c');
  15. const newSet = set1.union(set2);
  16. console.log(newSet); // (3) ["a", "b", "c"]

交集

交集:返回两个集合中共用元素的新集合

  1. intersection(otherSet){
  2. const intersectionSet = new Set();
  3. const values = this.values();
  4. for (let i = 0; i < values.length; i++) {
  5. // 传入的集合中有自己集合中这个项的话在插入数据
  6. if(otherSet.has(values[i])){
  7. intersectionSet.add(values[i])
  8. }
  9. }
  10. return intersectionSet;
  11. }
  12. const intersection =set1.intersection(set2);
  13. console.log(intersection.values()); // ['b']

差集

差集:返回存在第一个集合并且不存在第二个集合中的新集合

  1. // 差集和交集其实一样,唯一不同就是取反就能得到差集
  2. difference(otherSet){
  3. const differenceSet = new Set();
  4. this.values().forEach(element => {
  5. if(!otherSet.has(element)){
  6. differenceSet.add(element)
  7. }
  8. })
  9. return differenceSet
  10. }
  11. const difference = set1.difference(set2);
  12. console.log(difference.values()); // ['a']

子集

子集:验证一个集合是否是另一个集合的子集
验证一个集合里面所有元素 是否都存在另一个集合中(有一个不是就返回 false)

  1. isSubsetOf(otherSet){
  2. // 自己元素需要 大于 传入长度;
  3. if(this.size() > otherSet.size()){
  4. return false;
  5. }
  6. let isSbuset = true; // 假设当前实例是给定集合的子集;
  7. this.values().every(value => {
  8. if(!otherSet.has(value)){
  9. isSbuset = false;
  10. return false;
  11. }
  12. return true;
  13. })
  14. return isSbuset;
  15. }
  16. const set1 = new Set();
  17. const set2 = new Set();
  18. set1.add('a');
  19. set1.add('b');
  20. set2.add('b');
  21. // 验证set2里面所有元素是否都存在set1中
  22. const isSubsetOf = set2.isSubsetOf(set1);
  23. console.log(isSubsetOf); // true

原生Set模拟

  1. const set1 = new Set();
  2. const set2 = new Set();
  3. set1.add(1)
  4. set1.add(2)
  5. set1.add(3)
  6. set2.add(2)
  7. set2.add(3)
  8. set2.add(4)
  9. // 并集
  10. const union = (set1,set2) => {
  11. const newSet = new Set();
  12. set1.forEach(element => {
  13. newSet.add(element)
  14. });
  15. set2.forEach(element =>{
  16. newSet.add(element)
  17. })
  18. return newSet;
  19. }
  20. const unionResult = union(set1,set2);
  21. console.log(unionResult); // Set(4) {1, 2, 3, 4}
  22. // 交集
  23. const intersection = (set1,set2)=>{
  24. const newSet = new Set();
  25. set1.forEach(element => {
  26. if(set2.has(element)){
  27. newSet.add(element)
  28. }
  29. })
  30. return newSet;
  31. }
  32. const inter = intersection(set1,set2)
  33. console.log(inter);
  34. // 差集
  35. const difference = (set1,set2)=>{
  36. const newSet = new Set();
  37. set1.forEach(element => {
  38. if(!set2.has(element)){
  39. newSet.add(element)
  40. }
  41. })
  42. return newSet;
  43. }
  44. const diff = difference(set1,set2)
  45. console.log(diff);

es6模拟

  1. // 并集
  2. console.log(new Set([...set1,...set2]));
  3. // 交集
  4. console.log(new Set([...set1].filter(element => set2.has(element))));
  5. // 差集
  6. console.log(new Set([...set1].filter(element => !set2.has(element))));