數據結構之字典入門

前言

字典做爲最經常使用的數據結構之一,以鍵值對的形式存儲,最多見的好比像電話簿。字典常常被用來維護某些相對固定的枚舉方法或者屬性。javascript

字典咱們本文使用的是數組做爲其基本的數據結構支持,沒有使用對象,固然數組也是對象,而對象也是按照字典的基本思路設計的。沒有使用基本對象做爲其數據結構是由於咱們某些場景須要對字典進行排序。vue

本文源自《數據結構與算法javascript描述》這本書的字典第七章相關章節。java

使用場景

對象自己做爲字典

在寫業務代碼的時候,我不少時候看到小夥伴寫代碼的時候寫了過多的具備高度頻率重複的一些鍵值對的對應,或者說if,else的判斷。在這種狀況下,若是其枚舉屬性和值比較固定,建議其做爲一個枚舉字典固定存儲和全局使用或者按需使用,這樣代碼會精簡不少。好比:es6

// old codes 
let text = '';
if(status === 1){
	text = '沒有開課';
} else if(status === 2) {
	text = '上課中'
} else {
	text = '沒有這個課程';
}

// better codes in status.js or enum.js
const statusDict = {
	1:'沒有開課'2'上課中',
}
const getStatusText = (status) => {
  const defaultText = '沒有這個課程';
  if(!status) return defaultText;
	return statusDict[status] || defaultText;
}

// 在vue.js 中有過濾器這樣的方法,
//若是你的應用中高頻使用一種過濾器,且針對業務較固定,能夠考慮定義爲全局過濾器,字典結構維護和使用
複製代碼

其餘待補充

代碼實現

基本定義

由於es6中已經支持了class類,因此咱們直接用class語法來實現相關的代碼吧,在字典中必有的幾個操做,查詢,增長,移除,展現。算法

codepen代碼地址:連接api

class Dictionary{
  constructor(){
    this.dataStore = new Array();
    this.type = 'Dictionary';
  }
  find(key){
    return this.dataScore[key];
  }
  add(key, value){
    this.dataStore[key] = value ;
  }
  remove(key){
    delete this.dataStore[key];
  }
  showAll(){
    // 這裏說明下 for in拿到的是全部對象屬性 包括繼承來的,而Object.keys僅僅是自身屬性
    let keys = Object.keys(this.dataStore);
    for(var key in keys){
      console.log(`${keys[key]}:${this.dataStore[keys[key]]}`);
    }
  }
}

let numbook = new Dictionary();
numbook.add('mike',1314);
numbook.add('david',98732);
numbook.add('kitty',1314);
numbook.remove("mike");
numbook.showAll();
複製代碼

備註:咱們在遍歷數組內的全部含有值時,須要用for in遍歷,不能用普通的for循環,由於對於數組而言,非數字鍵的不計入其數組元素。而數組自己也是對象,特殊的是其固定的針對數字鍵的造成指定順序的顯示與返回。數組

另外我想說明的是,雖然對象自己就支持較好的字典性質的api,但咱們爲何還要額外去定義本身的數據結構呢?由於咱們不少時候須要的不是基本api,而是基於某些特定場景下對數據的靈活使用和封裝。若是咱們對業務代碼使用時一個基本的對象字典就夠了,固然不用額外定義字典類。可是當某些業務場景下須要咱們對字典這種基本api使用的條件下,再作一些額外的功能,那確定仍是須要額外定義本身的字典的。數據結構

輔助方法

咱們須要實現的輔助方法主要有下面幾種。ui

class Dictionary{
 // codes xxx
  // 返回具備的個數 ,爲何不用length,由於數組的lenth僅僅針對數字鍵
  count(){
    let n = 0 ;
    for(let p in Object.keys(this.datastore)){
    	n++;
	   }
    return n;
  }
  // 清除全部元素
  clear(){
    for each (let key in Object.keys(this.dataStore)){
    	delete this.dataStore[key]
    }
  }
  
}
複製代碼

按照順序顯示,前面講到咱們使用數組,主要是由於有排序的需求。那麼咱們的場景就假設在展現的時候排序便可。this

class Dictionary{
 // codes xxx
  // 返回具備的個數 ,爲何不用length,由於數組的lenth僅僅針對數字鍵
  showAllSort(){
   let keys = Object.keys(this.dataStore).sort();
    for(var key in keys){
      console.log(`${keys[key]}:${this.dataStore[keys[key]]}`);
    }
  }
  
}
複製代碼

練習

使用字典的結構,寫一個以下的程序,在一段英文文本內,判斷出每一個單詞出現的個數並最終顯示出來。

class WordCountDict{
  constructor(text){
    this.wordDict = {};
    this.text = text;
    this.init();
  }
  init(){
      let wordArr= this.text.split(' ');
      for(let i=0,len=wordArr.length;i<len;i++){
        if(wordArr[i] in this.wordDict){
          this.wordDict[wordArr[i]]++;
        } else {
          this.wordDict[wordArr[i]] = 1;
        }
      }
      for(let p in this.wordDict){
        console.log(`${p}:${this.wordDict[p]}`)
      }
  }
  
}

let text = 'I am a good student and you are a bad one and so on';
let textDict = new WordCountDict(text);
複製代碼
相關文章
相關標籤/搜索