前言

字典是一种以键-值对形式存储数据的数据结构,如同手机通讯录中,想要寻找一个电话时,只要找到名字就可以找到其电话号码。
JavaScript的Object类就是以字典的形式设计的。这里将使用Object类的特性,实现一个Dictionary类,让字典类型的对象使用起来更加简单。

一、构造字典数据结构

我们将使用JavaScript实现字典结构,各部分功能使用注释说明。

/**
 * Dictionary 构造方法
 * datastore 存储数据
 */
function Dictionary () {
  this.datastore = new Array()
  this.add = add
  this.find = find
  this.remove = remove
  this.showAll = showAll
  this.count = count
  this.clear = clear
  this.showAllBySort = showAllBySort
}

/**
 * add() 方法进行添加数据
 * @param {*} key
 * @param {*} value
 */
function add (key, value) {
  this.datastore[key] = value
}

/**
 * find() 方法进行查找key值对应的value
 * @param {*} key
 */
function find (key) {
  return this.datastore[key]
}

/**
 * remove() 方法进行删除对应的key值键值对
 * @param {*} key
 */
function remove(key) {
  delete this.datastore[key]
}

/**
 * showAll() 方法进行遍历显示所有的key、value
 */
function showAll () {
  let datakeys = Array.prototype.slice.call(Object.keys(this.datastore))
  for (let key in datakeys) {
    console.log(datakeys[key] + ' -> ' + this.datastore[datakeys[key]])
  }
}

/**
 * showAllBySort() 方法进行遍历显示所有排序后的key、value
 */
function showAllBySort () {
  let datakeys = Array.prototype.slice.call(Object.keys(this.datastore)).sort()
  for (let key in datakeys) {
    console.log(datakeys[key] + ' -> ' + this.datastore[datakeys[key]])
  }
}

其中有几点个人认为需要强调:

  1. 我们想要删除键-值对时需要使用JavaScript中的内置函数——delete。该函数使用对键的引用作为参数,同时删除键与其关联的值。
  2. 我们使用Object类keys()方法可以返回传入参数中存储的所有键。(Object.keys()for...in循环的区别主要在于for...in循环会枚举其原型链上的属性)
  3. slice()方法是从已有的数组中返回选定的元素
  4. 当我们在计算字典中元素的个数时,并没有直接使用length方法,因为当键的类型为字符串时,length属性无法使用

结束语

使用JavaScript实现字典数据结构相对来说难度不大,但我们需要注意其中的一些细节部分。

参考资料:数据结构与算法JavaScript描述 第7章 字典
由于书上的源代码出现了错误,因此代码根据实际运行结果做了相应修改。

Miyang
197 声望10 粉丝

快手前端工程师