【阅读笔记:字典】

什么是字典?

  • 字典和集合很类似,集合以[值,值]的形式存储元素,字典则以[键,值]的形式来存储元素。字典也称做映射、符号表、或关联数组

建立字典类

class Dictionary {
    constructor() {
    this.table = {}; // 存储字典中的元素
  }
}
复制代码
  • 若是能使用Object的实例存储字典中的元素时,尽可能使用对象而不是数组。

建立几个字典中方法

  1. toStrFn(key) 转字符串
toStrFn (key){
    if (key === null) {
    return 'NULL';
  } else if (key === undefined) {
    return 'UNDEFINED';
  } else if (typeof key === 'string' || key instanceof String) {
    return `${key}`;
  }else if ( Object.prototype.toString.call({})==='[object Object'] ){
    return JSON.stringify(obj)
  }
  return key.toString();
    }
复制代码
  • 在字典中,理想的状况是用字符串做为键名,值能够是任何类型。可是因为Javascript不是强类型的语言,咱们不能保证键必定是字符串。咱们须要把全部做为键名传入的对象转化为字符串。
  1. hasKey(key) 检查字典中是否存在某个相同的key,存在返回true,反之false
hasKey(key) { // 检查字典中是否存在某个相同的key,存在返回true,反之false
    return this.table[this.toStrFn(key)] != null;
  }
复制代码
  1. set(key, value)添加新元素,若是key存在,会覆盖
class ValuePair { // 此类用来存储table对象上的key属性
  constructor(key, value) {
    this.key = key;
    this.value = value;
  }
  toString() {
    return `[#${this.key}: ${this.value}]`;
  }
}

set(key, value) {
    if (key != null && value != null) {
      const tableKey = this.toStrFn(key); // 获取表示key的字符串
      this.table[tableKey] = new ValuePair(key, value); // 实例化ValuePair类。
      return true;
    }
    return false;
  }
复制代码
  • 该方法接受key和value做为参数。若是key和value存在,那么咱们获取表示key的字符串。
  • 建立一个新的键值对并将其赋值给table对象上的key属性。
  • 为了在字典中保存value,咱们将key转化为了字符串,而为了保存信息的须要,咱们一样要保存原始的key。咱们不能只将value保存在字典中,而是要保存两个值:原始的key和value。因此须要再另外建立一个ValuePair类来做为值
  • 为了字典能更简单的经过toString方法输出结果,咱们一样要为ValuePair类建立toString方法(简单的转换,为对象时未处理)
  • 若是key value是合法的,返回true,表示能够保存下来。反之,返回false。
  1. remove() 从字典中移除一个值
remove(key) {
    if (this.hasKey(key)) { // 若是字典中找到相同的key
      delete this.table[this.toStrFn(key)]; // 删除之
      return true; // 若是能删返回true
    }
    return false; // 不然返回false
  }
复制代码
  1. get() 从字典中检索一个值
get(key) {
    const valuePair = this.table[this.toStrFn(key)];
    return valuePair == null ? undefined : valuePair.value;
  }
复制代码
  • 首先检索table是否有此key,若是有,返回此对象的value。反之返回undefined。
  1. keyValues() 返回字典中的全部键值对
keyValues() {
    return Object.values(this.table); // 执行Object类内置的values方法(ECMAScript2017)
  }
复制代码
  1. keys()将全部键名以数组形式返回
keys() {
    return this.keyValues().map(valuePair => valuePair.key); // 嗯~ 没啥好解释的
  }
复制代码
  1. values() 将全部值以数组形式返回
values() {
    return this.keyValues().map(valuePair => valuePair.value); 
  }
复制代码
  1. forEatch(callbackFn) 迭代字典中的每一个键值对
forEach(callbackFn) {
    const valuePairs = this.keyValues(); // 获取全部valuePairs构成的数组
    for (let i = 0; i < valuePairs.length; i++) { // 迭代每一个valueParir
      const result = callbackFn(valuePairs[i].key, valuePairs[i].value); // 执行以参数形式传入forEach方法的callbackFn函数
      if (result === false) {// 若是回调参数返回false,会中断forEatch方法的执行,打断正在迭代valuePairs的for循环
        break;
      }
    }
  }
复制代码
  1. clear、size、isEmpty和toString方法
isEmpty() { // 字典是否为空
    return this.size() === 0;
    }
    
size() { // 返回字典所包含的数量
return Object.keys(this.table).length;
}

clear() { // 清空
this.table = {};
}

toString() { // 转字符串
if (this.isEmpty()) {
  return '';
}
const valuePairs = this.keyValues();
let objString = `${valuePairs[0].toString()}`;
for (let i = 1; i < valuePairs.length; i++) {
  objString = `${objString},${valuePairs[i].toString()}`;
}
return objString;
}
复制代码

使用字典

  • 要使用Dictionary类,首先须要建立一个实例,而后给它添加三条电子邮件地址。来实现一个电子邮件地址簿。
const dictionary = new Dictionary();

dictionary.set('Gandalf', 'gandalf@email.com'); // 添加
dictionary.set('John', 'johnsnow@email.com');// 添加
dictionary.set('Tyrion', 'tyrion@email.com');// 添加

console.log(dictionary.hasKey('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.remove('John');

console.log(dictionary.keys()); // ["Gandalf", "Tyrion"]

console.log(dictionary.values()); // ["gandalf@email.com", "tyrion@email.com"]

console.log(dictionary.keyValues()); // [{key: "Gandalf", value: "gandalf@email.com"}, {key: "Tyrion", value: "tyrion@email.com"}]

console.log(dictionary.toString()); // [#Gandalf: gandalf@email.com],[#Tyrion: tyrion@email.com]

dictionary.forEach((k, v) => {
  console.log('forEach: ', `key: ${k}, value: ${v}`);
});
// forEach: key: Gandalf, value: gandalf@email.com
// forEach: key: Tyrion, value: tyrion@email.com
复制代码

最后

本文内容来自本菜阅读《Javascript数据结构与算法》第三版第八章后,整理抄录。码字不易,若是以为还能够,欢迎各位点赞!!!javascript

相关文章
相关标签/搜索