數據結構-字典

字典是一種以 - 對形式存儲結構的數據結構, 就像電話號碼薄裏的名字和電話號碼同樣. 要找一個電話時, 先找名字, 名字找到了, 緊挨着它的電話號碼也就找到了. 這裏的 是指你用來查找的東西, 是查找獲得的結果.
JSObject類就是以字典形式設計的. 本章將使用 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

相關文章
相關標籤/搜索