javascript中的字典

nd發表於2017-01-15

1.概念

    字典是一種以鍵值對的形式儲存的資料結構,就係那個電話本中的名字和電話號碼一樣。要找到一個電話首先要找到名字,再根據名字找到電話號碼。這裡的鍵就是指用來查詢的東西,值就是查詢得到的結果。

    Javascript中的object類就是已字典的形式設計的。這裡使用object類本身的特性,實現一個dictionary類,讓字典型別的對戲那個使用起來更加簡單。

    dictionary類的基礎是array類,不是object類。稍後將會提到,我們想對字典中的鍵排序,而Javascript中是不能對物件的屬性經行排序。Javascript中一切皆是物件,陣列也是物件。

    先使用下面的方法來定義dictionary類:

function Dictionary(){
    this.datastore = new Object();
}

    先來定義一個add方法,該方法接受兩個引數,鍵和值。鍵是值在字典下的索引,如下:

function add(key, value){
    this.datastore[key] = value;
}

    接下來定義find方法,該方法以鍵作為引數,返回和其關聯的值,程式碼如下:

function find(key){
    return this.datastore[key];
}

    從字典中刪除鍵值對需要使用Javascript中的一個內建函式,delete,這個函式是object類的一部分,使用對鍵的引用作為引數,該函式同時刪掉和其關聯的值。程式碼如下:

function remove(key){
    delete this.datastore[key];
}

    最後我們希望可以顯示字典中所有的鍵值對,下面是一個完成該任務的方法:

function showAll(){
    for (var key in this.datastore) {
        document.write(key + '->' + this.datastore[key]);
        document.write('<br>');
    }
}

    我們還可以定義一些在特定情況下有用的輔助方法。比如,要是知道字典中元素的個數就好了,那麼可以頂一個count方法,如下:

function count(){
    var n = 0;
    for (var key in this.datastore) {
        ++n;
    }
    return n;
}

   很多看官和我一樣會想,能不能用length屬性,這是不行的,因為當鍵的型別為字串的時候,length屬性就不管用了,可以使用下面的程式碼來測試:

var nums = new Array();
nums[0] = 1;
nums[1] = 2;
console.info(nums.length); // 顯示2
var pbook = new Array();
pbook["David"] = 1;
pbook["Jennifer"] = 2;
console.info(pbook.length); // 顯示0

    clear是另外一種輔助方法,定義如下:

function clear(){
    for (var key in this.datastore) {
        delete this.datastore[key];
    }
}

    字典的主要用途是通過鍵取值,我們無需關係資料在字典中的實際儲存順序。然後很多人希望看到一個有序的字典。我的做法是先把鍵值對的所有鍵值取出來,放在一個陣列中,然後對這個陣列排序,最後按照排序後的順序輸出值,如下:

function sort(){
    var keys = Array();
    for (var key in this.datastore) {
        keys.push( key );
    }
    keys.sort();
    for (var i=0; i<keys.length; i++) {
        document.write(keys[i] + '->' + this.datastore[keys[i]]);
        document.write('<br>');
    }
}

 

2.程式碼實現

  下面看看上面所有的問題程式碼:

function Dictionary(){
    this.add = add;
    this.datastore = new Object();
    this.find = find;
    this.remove = remove;
    this.showAll = showAll;
    this.length = length;
    this.count = count;
    this.clear = clear;
    this.sort = sort;
}

function add(key, value){
    this.datastore[key] = value;
}

function find(key){
    return this.datastore[key];
}

function remove(key){
    delete this.datastore[key];
}

function count(){
    var n = 0;
    for (var key in this.datastore) {
        ++n;
    }
    return n;
}

function showAll(){
    for (var key in this.datastore) {
        document.write(key + '->' + this.datastore[key]);
        document.write('<br>');
    }
}

function sort(){
    var keys = Array();
    for (var key in this.datastore) {
        keys.push( key );
    }
    keys.sort();
    for (var i=0; i<keys.length; i++) {
        document.write(keys[i] + '->' + this.datastore[keys[i]]);
        document.write('<br>');
    }
}

function clear(){
    for (var key in this.datastore) {
        delete this.datastore[key];
    }
}

var pbook = new Dictionary();
pbook.add("Raymond","123");
pbook.add("David", "345");
pbook.add("Cynthia", "456");

pbook.showAll();
document.write('after sort:' + '<br>')
pbook.sort();

document.write("Number of entries: " + pbook.count() + '<br>');
document.write("David's extension: " + pbook.find("David") + '<br>');
pbook.showAll();
pbook.clear();
document.write("Number of entries: " + pbook.count() + '<br>');

上面程式碼在瀏覽器下的輸出結果如下:

 

相關文章