【閱讀筆記:字典】

什麼是字典?

  • 字典和集合很類似,集合以[值,值]的形式存儲元素,字典則以[鍵,值]的形式來存儲元素。字典也稱做映射、符號表、或關聯數組

建立字典類

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

相關文章
相關標籤/搜索