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>');
上面代码在浏览器下的输出结果以下: