# 集合(Set)

集合為無順序性且值不重複

# Result:

class Set {
  constructor() {
    this.items = {};
  }
  has(value) {
    return this.items.hasOwnProperty(value);
  }
  add(value) {
    //如果這個值不存在才新增至物件,存在則直接回傳false
    if (!this.has(value)) {
      this.items[value] = value;
      return true;
    }
    return false;
  }
  remove(value) {
    if (this.has(value)) {
      delete this.items[value];
      return true;
    }
    return false;
  }
  clear() {
    this.items = {};
  }
  size() {
    return Object.keys(this.items).length; //只能在現代瀏覽器中運行
  }
  values() {
    return Object.keys(this.items);
  }

  //聯集
  union(otherSet) {
    let unionSet = new Set();
    let values = this.values();
    for (let i = 0; i < values.length; i++) {
      unionSet.add(values[i]);
    }
    values = otherSet.values();
    for (let i = 0; i < values.length; i++) {
      unionSet.add(values[i]);
    }
    return unionSet;
  }
  //交集
  intersection(otherSet) {
    let intersectionSet = new Set();
    let values = this.values();
    for (let i = 0; i < values.length; i++) {
      if (otherSet.has(values[i])) {
        intersectionSet.add(values[i]);
      }
    }
    return intersectionSet;
  }
  //差集
  difference(otherSet) {
    let differenceSet = new Set();
    let values = this.values();
    for (let i = 0; i < values.length; i++) {
      if (!otherSet.has(values[i])) {
        differenceSet.add(values[i]);
      }
    }
    return differenceSet;
  }
  //子集
  subSet(otherSet) {
    let values = this.values();
    if (this.size() > otherSet.size()) {
      return false;
    } else {
      for (let i = 0; i < values.length; i++) {
        if (!otherSet.has(values[i])) {
          return false;
        }
      }
      return true;
    }
  }
}

let n1 = new Set();
n1.add('Alan');
console.log(n1);
n1.remove('Alan');
console.log(n1);
console.log(n1.size());
n1.add('John');
console.log(`size: ${n1.size()}`);
//console.log(`sizeLegacy: ${n1.sizeLegacy()}`);

let nA = new Set();
nA.add(1);
nA.add(2);
nA.add(3);
let nB = new Set();
nB.add(2);
nB.add(3);
nB.add(4);
nB.add(5);

console.log('nA: ' + nA.values());
console.log('nB: ' + nB.values());

let unionAB = nA.union(nB);
console.log(unionAB.values());

let intersectionAB = nA.intersection(nB);
console.log(intersectionAB.values());

let differenceAB = nA.difference(nB);
console.log(differenceAB.values());

let subSetAB = nA.subSet(nB);
console.log(subSetAB);
Last Updated: 2021-07-22 23:51