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>');
上面程式碼在瀏覽器下的輸出結果如下: