字典是一種以 鍵 - 值 對形式存儲結構的數據結構, 就像電話號碼薄裏的名字和電話號碼同樣. 要找一個電話時, 先找名字, 名字找到了, 緊挨着它的電話號碼也就找到了. 這裏的 鍵 是指你用來查找的東西, 值 是查找獲得的結果.
JS
的Object
類就是以字典形式設計的. 本章將使用Object
類自己的特性, 實現一個Dictionary
類, 讓這種字典類型的對象使用起來更加簡單. 你也能夠只使用數組和對象來實現本章展現的方法, 可是定義一個Dictionary
類更方便, 也更有意思. 好比, 使用()
引用鍵就比使用[]
簡單. 固然, 還有其餘一些便利, 好比能夠定義對總體進行操做的方法, 舉個栗子, 顯示字典中全部的元素, 這樣就沒必要在主程序中循環去遍歷字典了.
Dictionary
類Dictionary
類是基礎是Array
類, 而不是Object
類. 本章稍後將提到, 咱們想對字典中的鍵排序, 而JS
中是不能對對象的屬性進行排序的. 可是也不要忘記, JS
中一切皆對象, 數組也是對象.數組
window.log = console.log.bind(console) class Dictionary { constructor() { this._datastore = []; } add(key, value) { this._datastore[key] = value; } find(key) { return this._datastore[key]; } remove(key) { delete this._datastore[key]; } showAll() { Object.keys(this._datastore).forEach(key => { log(`${key} ===>>> ${this._datastore[key]}`) }) } }; const pbook = new Dictionary(); pbook.add('做家1', '書1'); pbook.add('做家2', '書2'); pbook.add('做家3', '書3'); pbook.add('做家4', '書4'); pbook.showAll(); log('</br>') pbook.remove('做家3'); pbook.showAll();
add()
方法接受兩個參數: 鍵和值. 鍵是值在字典中索引. find()
方法以鍵爲參數, 返回和其相關聯的值.remove()
方法用到了JS
中的一個內置函數: delete
.該函數是Object
類的一部分, 使用對鍵的引用做爲參數. 該函數同時刪掉鍵和與其關聯的值.showAll()
方法顯示字典中全部的鍵值對.數據結構
Dictionary
類的輔助方法咱們還能夠定義一些在特定狀況下用的輔助方法.函數
... count() { let n = 0; Object.keys(this._datastore).forEach(i => { n++ }); return n; } clear() { Object.keys(this._datastore).forEach(key => { delete this._datastore[key] }); } ...
好比, 要是能知道字典中的元素個數就行了, 那麼就能夠定義一個count()
方法.
這裏你可能就要問了, 既然_datastore
是數組類型的話爲何不直接用length
屬性呢? 這是由於當鍵的類型爲字符串時, length
屬性就無論用了. eg:this
const nums = []; nums[0] = 1; nums[1] = 2; log(nums.length); // 2 const book = []; book['a'] = 1; book['b'] = 2; log(book.length); // 0
以及清空字典clear()
. 這裏使用this._datastore = []
也是能夠的;設計
Dictionary
類添加排序功能字典的主要用途是經過鍵取值, 咱們無需太關心數據在字典中的實際存儲順序. 然而, 不少人都但願看到一個有序的字典. 下面來看看如何讓前面的字典按順序顯示.code
數組是能夠排序的, eg:對象
const a = []; a[0] = 'm'; a[1] = 'd'; log(a); // m d a.sort(); log(a); // d m
可是上面的這種作法是對字符串做爲鍵的字典無效的, 程序會沒有任何輸出. 這和咱們前面定義count()
方法時狀況一致;排序
不過這也不是大問題. 用戶關心的是顯示字典的內容時, 結果是有序的. 可以使用Object.keys()
函數解決這個問題, 從新定義showAll()
方法:索引
showAll() { Object.keys(this._datastore).sort().forEach(key => { log(`${key} ===>>> ${this._datastore[key]}`) }) }
和前面的區別是: 拿到_datastore
的鍵後, 調用sort()
方法對鍵從新排序.rem