javascript中的字典


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>');

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM