1. 集合是保存不重复数据的无序数据集
    1. 数据不重复
    2. 无序

采用对象的形式封装set

  1. /**
  2. * 集合:没有重复数据的无序数据集
  3. *
  4. * 1.add(element) 向集合中添加元素
  5. * 2.delete(element) 向集合中删除元素
  6. * 3.has(element) 判断是否包含某元素
  7. * 4.clear 清空集合
  8. * 5.size 集合元素数量
  9. * 6.values 返回一个包含集合中所有元素的数组
  10. */
  11. class Set {
  12. constructor() {
  13. // 用对象存储数据
  14. this.items = {};
  15. }
  16. has(element) {
  17. // return element in this.items
  18. return Object.prototype.hasOwnProperty.call(this.items, element);
  19. }
  20. add(element) {
  21. if (this.has(element)) {
  22. return false;
  23. } else {
  24. this.items[element] = element;
  25. return true;
  26. }
  27. }
  28. delete(element) {
  29. if (this.has(element)) {
  30. return false;
  31. } else {
  32. delete this.items[element];
  33. return true;
  34. }
  35. }
  36. clear() {
  37. this.items = {};
  38. }
  39. size() {
  40. return Object.keys(this.items).length;
  41. }
  42. values() {
  43. // const arr = [];
  44. // for (let key in this.items) {
  45. // arr.push(this.items[key]);
  46. // }
  47. // return arr;
  48. // 使用Object.values方法 -- 返回value值组成的数组
  49. return Object.values(this.items);
  50. }
  51. }

集合运算

并集

  1. 对于给定的两个集合,返回一个包含两个几个中所有元素的集合
  1. union(otherSet) {
  2. const newSet = new Set();
  3. // 1.遍历当前集合,插入到新的集合中
  4. this.values().forEach((item) => newSet.add(item));
  5. // 2.遍历参数集合,插入到新的集合
  6. otherSet.values().forEach((item) => newSet.add(item));
  7. return newSet;
  8. }

交集

  1. 对于给定的两个集合,返回一个包含两个集合共有元素的新集合

代码优化:通过判断哪个集合元素更少,遍历较少元素的集合

  1. intersection(otherSet) {
  2. const newSet = new Set();
  3. // 通过function - has判断是否两个几个都包含该元素
  4. this.values().forEach((item) => {
  5. if (otherSet.has(item)) {
  6. newSet.add(item);
  7. }
  8. });
  9. return newSet;
  10. }
  11. intersection(otherSet) {
  12. let newSet = new Set();
  13. let diffSet1 =
  14. this.values().length > otherSet.values().length ? otherSet : this;
  15. let diffSet2 =
  16. this.values().length < otherSet.values().length ? otherSet : this;
  17. diffSet1.values().forEach((item) => {
  18. if (diffSet2.has(item)) {
  19. newSet.add(item);
  20. }
  21. });
  22. return newSet;
  23. }

差集

  1. 对于给定的两个集合,返回一个A集合有但是B集合没有的集合 - 交集的判断反过来即可
  1. diff(otherSet) {
  2. const newSet = new Set();
  3. this.values().forEach((item) => {
  4. // A有B无
  5. if (!otherSet.has(item)) {
  6. newSet.add(item);
  7. }
  8. });
  9. return newSet;
  10. }

子集

判断一个集合是否为该集合的子集

  1. sub(subSet) {
  2. if (subSet.values().length > this.values().length) {
  3. return false;
  4. }
  5. // 参数集合中的每个元素都能在父集合中找到
  6. let right = true;
  7. subSet.values().forEach((item) => {
  8. if (!this.has(item)) {
  9. right = false;
  10. }
  11. });
  12. return right;
  13. }

原生set方法

  1. 与封装不同的是,打印set 结果是一对花括号包裹一个字符序列
  2. function
    1. add:添加元素
    2. delete:删除元素
    3. size:集合元素数量
    4. clear:清空集合
    5. has:判断是否包含该元素
    6. values:返回迭代器
  3. 原生set可以直接使用数组的遍历方法forEach
  4. new Set接收数组作为参数

Snipaste_2022-05-08_17-33-12.png

扩展运算符+set:去除数组重复元素

  1. set需要传入数组作为参数
  1. let arr = [1, 2, 3, 3, 3, 4, 5, 2, 1, 3, 4];
  2. arr = [...new Set(arr)];
  3. console.log(arr);
  4. console.log(...arr);
  5. console.log([...arr]);