# 字典

字典是跟集合很相似的一种数据结构,都可以用来存储无序不重复的数据。不同的地方是集合以 [值,值] 的形式存储,而字典则是以 [键,值] 的形式存储。

字典也被称作映射(Map)。

# 字典的操作

set(key, value):向字典中添加新元素 — delete(key):通过使用键值来从字典中移除键值对应的数据值 — has(key):如果某个键值存在于这个字典中,则返回 true,反之则返回 falseget(key):通过键值查找特定的数值并返回 — clear():将这个字典中的所有元素全部删除 — size():返回字典所包含元素的数量 — keys():将字典所包含的所有键名以数组形式返回 — values():将字典所包含的所有数值以数组形式返回

# 字典的实现

class Dictionary {
  constructor() {
    this._obj = Object.create(null)
  }

  has(key) {
    return Reflect.has(this._obj, key)
  }

  set(key, value) {
    this._obj[key] = value
  }

  delete(key) {
    if (this.has(key)) {
      return Reflect.deleteProperty(this._obj, key)
    }
    return false
  }

  get(key) {
    return this._obj[key]
  }

  values() {
    return Object.values(this._obj)
  }

  clear() {
    this._obj = Object.create(null)
  }

  size() {
    return this.values().length
  }

  keys() {
    return Object.keys(this._obj)
  }

  getItems() {
    return this._obj
  }
}

var dictionary = new Dictionary()
dictionary.set('Gandalf', 'gandalf@email.com')
dictionary.set('John', 'johnsnow@email.com')
dictionary.set('Tyrion', 'tyrion@email.com')
console.log(dictionary.has('Gandalf')) // true
console.log(dictionary.size()) // 3
console.log(dictionary.keys()) // ["Gandalf", "John", "Tyrion"]
console.log(dictionary.values()) // ["gandalf@email.com", "johnsnow@email.com", "tyrion@email.com"]
console.log(dictionary.get('Tyrion')) // tyrion@email.com
dictionary.delete('John')
console.log(dictionary.keys()) // ["Gandalf", "Tyrion"]
console.log(dictionary.values()) // ["gandalf@email.com", "tyrion@email.com"]
console.log(dictionary.getItems()) // Object {Gandalf: "gandalf@email.com", Tyrion: "tyrion@email.com"}