学习js数据结构与算法-字典(1)

138 阅读3分钟

这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。

第二十一天:开始学习集合

字典(Map)

集合(Set)表示一组互不相同的元素(不重复的元素)。在字典中,存储的是键值对。JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,和集合(Set类)类似,es6同样包含了一个Map类的实现。

创建字典类

要实现字典类,我们需要一个辅助函数,转换字符串的函数,因为在字典中,理想的情况是用字符串作为健名,值可以是任何类型,但我们存储时,传入的不一定是字符串,所以我们需要实现这个功能,把所有键名转化为字符串,使得从字典类中搜索和获取值更简单。所以我们先实现这个函数

function defaultToString(key) {
  if(key === null) {
    return 'NULL';
  } else if (key === undefined) {
    return 'UNDEFINED'
  } else if (Object.prototype.toString.call(key) === '[object Object]' || Object.prototype.toString.call(key) === '[object Array]') {
    return JSON.stringify(key);
  }
  return key.toString();
}
import { defaultToString } from './utils'
export default class Dictionary {
  constructor(toStrFn = defaultToString) {
    this.toStrFn = toStrFn
    this.table = {}
  }
}

我们将在【键, 值】对保存为table[key] = {key, value}

下面我们将实现字典所能用的方法

  • set(key,value):向字典中添加新元素。如果 key 已经存在,那么已存在的 value 会 被新的值覆盖。

  • remove(key):通过使用键值作为参数来从字典中移除键值对应的数据值。

  • hasKey(key):如果某个键值存在于该字典中,返回 true,否则返回 false。

  • get(key):通过以键值作为参数查找特定的数值并返回。

  • clear():删除该字典中的所有值。

  • size():返回字典所包含值的数量。与数组的 length 属性类似。

  • isEmpty():在 size 等于零的时候返回 true,否则返回 false。

  • keys():将字典所包含的所有键名以数组形式返回。

  • values():将字典所包含的所有数值以数组形式返回。

  • keyValues():将字典中所有[键,值]对返回。

  • forEach(callbackFn):迭代字典中所有的键值对。callbackFn 有两个参数:key 和

    value。该方法可以在回调函数返回 false 时被中止(和 Array 类中的 every 方法相似)。

我们第一个需要实现的方法是hasKey方法。是因为它会被set和remove等其他方法调用。

hasKey(key) {
  return this.table[this.toStrFn(key)] !== null
}

js值允许我们使用字符串作为对象的键名,所以如果传入一个复杂对象作为键,需要将它转化为一个字符串。