1. 集合
 
- 集合通常是由一组无序的,不能重复的元素构成
 - 集合是一种特殊的数组 
  
- 特殊之处在与里面的元素没有顺序,也不能重复
 - 没有顺序就代表不能通过下标去获取值,不能重复表示在一个集合中相同的数据只会存在一分
 
  - 在ES6中的Set就是一个集合
 
 
1.1 集合的封装
 
class Set {
  constructor() {
    this.obj = {}
    
    this.size = 0
  }
  
  add(value) {
    if (this.has(value)) {
      throw new Error("集合中不能添加相同的属性")
    }
    this.obj[value] = value
    this.size++
  }
  
  remove(value) {
    if (!this.has(value)) {
      throw new Error("集合中没有当前属性,删除不了")
    }
    delete this.obj[value]
    this.size--
  }
  
  has(value) {
    
    return this.obj.hasOwnProperty(value)
  }
  
  clear() {
    this.obj = {}
    this.size = 0
  }
  
  size() {
    return this.size
  }
  
  values() {
    
    return Object.keys(this.obj)
  }
  
  
  union(otherSet) {
    let newSet = new Set()
    
    let values = this.values()
    for (let i = 0; i < values.length; i++) {
      newSet.add(values[i])
    }
    
    let otherValues = otherSet.values()
    for (let i = 0; i < otherValues.length; i++) {
      
      if (!newSet.has(otherValues[i])) {
        
        newSet.add(otherValues[i])
      }
    }
    return newSet
  }
  
  intersection(otherSet) {
    let newSet = new Set()
    let values = this.values()
    for (let i = 0; i < values.length; i++) {
      let item = values[i]
      
      if (otherSet.has(item)) {
        newSet.add(item)
      }
    }
    return newSet
  }
  
  difference(otherSet) {
    let newSet = new Set()
    let values = this.values()
    for (let i = 0; i < values.length; i++) {
      let item = values[i]
      
      if (!otherSet.has(item)) {
        newSet.add(item)
      }
    }
    return newSet
  }
  
  subset(otherSet) {
    let otherValues = otherSet.values()
    for (let i = 0; i < otherValues.length; i++) {
      
      
      if (!this.has(otherValues[i])) {
        return false
      }
    }
    return true
  }
}