1.概念

字典是一种以键值对的形式存储的数据结构,就系那个电话本中的名字和电话号码一样。要找到一个电话首先要找到名字,再根据名字找到电话号码。这里的键就是指用来查找的东西,值就是查找得到的结果。

Javascript中的object类就是已字典的形式设计的。这里使用object类本身的特性,实现一个dictionary类,让字典类型的对戏那个使用起来更加简单。

dictionary类的基础是array类,不是object类。稍后将会提到,我们想对字典中的键排序,而Javascript中是不能对对象的属性经行排序。Javascript中一切皆是对象,数组也是对象。

先使用下面的方法来定义dictionary类:

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

先来定义一个add方法,该方法接受两个参数,键和值。键是值在字典下的索引,如下:

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

接下来定义find方法,该方法以键作为参数,返回和其关联的值,代码如下:

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

从字典中删除键值对需要使用Javascript中的一个内置函数,delete,这个函数是object类的一部分,使用对键的引用作为参数,该函数同时删掉和其关联的值。代码如下:

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

最后我们希望可以显示字典中所有的键值对,下面是一个完成该任务的方法:

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

我们还可以定义一些在特定情况下有用的辅助方法。比如,要是知道字典中元素的个数就好了,那么可以顶一个count方法,如下:

  1. function count(){
  2. var n = 0;
  3. for (var key in this.datastore) {
  4. ++n;
  5. }
  6. return n;
  7. }

很多看官和我一样会想,能不能用length属性,这是不行的,因为当键的类型为字符串的时候,length属性就不管用了,可以使用下面的代码来测试:

  1. var nums = new Array();
  2. nums[0] = 1;
  3. nums[1] = 2;
  4. console.info(nums.length); // 显示2
  5. var pbook = new Array();
  6. pbook["David"] = 1;
  7. pbook["Jennifer"] = 2;
  8. console.info(pbook.length); // 显示0

clear是另外一种辅助方法,定义如下:

  1. function clear(){
  2. for (var key in this.datastore) {
  3. delete this.datastore[key];
  4. }
  5. }

字典的主要用途是通过键取值,我们无需关系数据在字典中的实际存储顺序。然后很多人希望看到一个有序的字典。我的做法是先把键值对的所有键值取出来,放在一个数组中,然后对这个数组排序,最后按照排序后的顺序输出值,如下:

  1. function sort(){
  2. var keys = Array();
  3. for (var key in this.datastore) {
  4. keys.push( key );
  5. }
  6. keys.sort();
  7. for (var i=0; i<keys.length; i++) {
  8. document.write(keys[i] + '->' + this.datastore[keys[i]]);
  9. document.write('<br>');
  10. }
  11. }

2.代码实现

  下面看看上面所有的问题代码:

  1. function Dictionary(){
  2. this.add = add;
  3. this.datastore = new Object();
  4. this.find = find;
  5. this.remove = remove;
  6. this.showAll = showAll;
  7. this.length = length;
  8. this.count = count;
  9. this.clear = clear;
  10. this.sort = sort;
  11. }
  12.  
  13. function add(key, value){
  14. this.datastore[key] = value;
  15. }
  16.  
  17. function find(key){
  18. return this.datastore[key];
  19. }
  20.  
  21. function remove(key){
  22. delete this.datastore[key];
  23. }
  24.  
  25. function count(){
  26. var n = 0;
  27. for (var key in this.datastore) {
  28. ++n;
  29. }
  30. return n;
  31. }
  32.  
  33. function showAll(){
  34. for (var key in this.datastore) {
  35. document.write(key + '->' + this.datastore[key]);
  36. document.write('<br>');
  37. }
  38. }
  39.  
  40. function sort(){
  41. var keys = Array();
  42. for (var key in this.datastore) {
  43. keys.push( key );
  44. }
  45. keys.sort();
  46. for (var i=0; i<keys.length; i++) {
  47. document.write(keys[i] + '->' + this.datastore[keys[i]]);
  48. document.write('<br>');
  49. }
  50. }
  51.  
  52. function clear(){
  53. for (var key in this.datastore) {
  54. delete this.datastore[key];
  55. }
  56. }
  57.  
  58. var pbook = new Dictionary();
  59. pbook.add("Raymond","123");
  60. pbook.add("David", "345");
  61. pbook.add("Cynthia", "456");
  62.  
  63. pbook.showAll();
  64. document.write('after sort:' + '<br>')
  65. pbook.sort();
  66.  
  67. document.write("Number of entries: " + pbook.count() + '<br>');
  68. document.write("David's extension: " + pbook.find("David") + '<br>');
  69. pbook.showAll();
  70. pbook.clear();
  71. document.write("Number of entries: " + pbook.count() + '<br>');

上面代码在浏览器下的输出结果如下:

javascript中的字典的更多相关文章

  1. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  2. Javascript中的字典和散列

    function Dictionary() { var items={}; this.set=function (key,value) { items[key]=value; }; this.remo ...

  3. 深夜重温JavaScript中的对象和数组

    这一块实际上已经学过了,因为没有学好,在工作过程中遇到一些对象或者数组的操作,会去百度查找,浪费了许多宝贵的时间,所以特地再拐过头来重新学习. 对象 基本概念: 对象这种基本的数据结构还有其他很多种叫 ...

  4. Javascript 中判断对象为空

    发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...

  5. javascript中数组常用的方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法.数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回'object'. ...

  6. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  7. [转] JavaScript中的属性:如何遍历属性

    在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...

  8. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

  9. JavaScript 中常见的内存泄露陷阱(摘)

    内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...

随机推荐

  1. 【从汉字中提取数字】不用公式,不用VBA,如此简单的方法你是否用过?

    转自:http://huaban.com/pins/19664410 具体操作过程请看附图动画:

  2. Junit单元测试的简单使用(主要是在spring框架下的项目)

    首先是解释什么是单元测试,单元测试是指对于一个大型项目里,对于单一模块或者单一接口的测试. 然后解释为什么要写单元测试,首先对于一个大型的项目,如果你每次都要重启一遍服务器调页面或者接口的bug,那就 ...

  3. 第13章 Swing程序设计----常用面板

    面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中. Swing常用的面板包括JPanel面板和JScrollPanel面板. 1.JPanel面板 import j ...

  4. 转 Fragment 和 FragmentActivity的使用

    今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习. 要想用Fragment ...

  5. oracle数据库查询常用语句

    1.查询SCOTT表中有多少表,并显示表的一些描述select * from all_tables WHERE owner='SCOTT' ; 2.查询oracle数据库版本select * from ...

  6. HTML5的兼容问题以及调用js文件的方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. StrictMode使用详解

    http://hb.qq.com/a/20110914/000054.htm http://www.android100.org/html/201204/25/1097.html http://www ...

  8. 利用MyEclipse连接数据库并自动生成基于注解或者XML的实体类

    一.利用MyEclipse连接数据库 1. 打开MyEclipse的数据库连接视图 然后在Other中找到"MyEclipse Database"中的DB Browser 2. 在 ...

  9. 基于Verilog HDL的ADC0809CCN数据采样

    本实验是用ADC0809CCN进行数据采样,并用7段数码管进行显示. ADC0809由一个8路模拟开关.一个地址锁存与译码器.一个A/D转换器和一个三态输出锁存器组成.多路开关可选通8个模拟通道,允许 ...

  10. 2016"百度之星" - 资格赛(Astar Round1) Problem D

    排个序,map直接搞. #include <stdio.h> #include <math.h> #include<cstring> #include<cma ...