1.概念數組
字典是一種以鍵值對的形式存儲的數據結構,就係那個電話本中的名字和電話號碼同樣。要找到一個電話首先要找到名字,再根據名字找到電話號碼。這裏的鍵就是指用來查找的東西,值就是查找獲得的結果。瀏覽器
Javascript中的object類就是已字典的形式設計的。這裏使用object類自己的特性,實現一個dictionary類,讓字典類型的對戲那個使用起來更加簡單。數據結構
dictionary類的基礎是array類,不是object類。稍後將會提到,咱們想對字典中的鍵排序,而Javascript中是不能對對象的屬性經行排序。Javascript中一切皆是對象,數組也是對象。函數
先使用下面的方法來定義dictionary類:測試
function Dictionary(){ this.datastore = new Object(); }
先來定義一個add方法,該方法接受兩個參數,鍵和值。鍵是值在字典下的索引,以下:this
function add(key, value){ this.datastore[key] = value; }
接下來定義find方法,該方法以鍵做爲參數,返回和其關聯的值,代碼以下:spa
function find(key){ return this.datastore[key]; }
從字典中刪除鍵值對須要使用Javascript中的一個內置函數,delete,這個函數是object類的一部分,使用對鍵的引用做爲參數,該函數同時刪掉和其關聯的值。代碼以下:設計
function remove(key){ delete this.datastore[key]; }
最後咱們但願能夠顯示字典中全部的鍵值對,下面是一個完成該任務的方法:code
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>');
上面代碼在瀏覽器下的輸出結果以下: