第六章:javascript:字典

字典是一种以键-值对应形式存储的数据结构,就像电话薄里的名字和电话号码一样。只要找一个电话,查找名字,名字找到后,电话号码也就找到了。这里的键值是你用来查找的东西,值就是要查的到的结果。

javascript的Object类就是以这种字典的形式设计的。本章利用Object类本身的特性,实现一个Dictionary类,让这种类型的对象使用起来更简单。你也可以使用数组和对象来实现本章展示的方法。但是定义一个Dictionary类更方便,也更有意思。比如,使用()就比使用[]简单。当然,还有其它的一些便利,比如可以定义对整体进行操作的方法,举个例子:显示字典中所有的元素,这样就不必在主程序中使用循环去遍历整个字典了。

一,Dictionary类

Dictionary类的基础是Array类,而不是Object类。本章稍后将提到,我们想对字典中的键排序,而javascript中是不能对对象的属性进行排序的。但要记住,javascript一切皆为对象,数组也是对象。

以下面的代码开始定义Dictionary类:

    function Dictionary() {
        this.datastore = new Array();
    }

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

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

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

    function find(key) {
        return this.datastore[key]
    }

从字典中删除键-值。需要使用javascript中一个内置函数:delete。该函数是Object类的一部分,使用对键的引用作为参数。该函数同时删掉键和与其无关的值。下面是remove()的定义。

    function remove(key) {
        delete this.datastore[key] //delete是Object类的一部分,使用对键删掉键和与其无关的值。
    }

最后,我们希望显示字典中所有的键-值对,下面就是一个显示的方法。

    function showAll() {
        for (var key in Object.keys(this.datastore)) {
            console.log(key + " -> " + this.datastore[key])
        }
    }

最后调用Object的keys()方法可以返回传入参数中储存的所有键。

测试方法

    function Dictionary() {
        this.add = add;
        this.datastore = new Array();
        this.find = find;
        this.remove  = remove;
        this.showAll = showAll;
    }

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

    function find(key) {
        return this.datastore[key]
    }

    function remove(key) {
        delete this.datastore[key] //delete是Object类的一部分,使用对键删掉键和与其无关的值。
    }

    function showAll() {
        for (var key in Object.keys(this.datastore)) {  //调用Object的keys()方法可以返回传入参数中储存的所有键
            console.log(key + " -> " + this.datastore[key])
        }
    }

    //测试
    var pbook = new Dictionary();
    pbook.add("Mike","123");
    pbook.add("David","345");
    pbook.add("Cynthia","456");
    console.log(" David‘s extension: " + pbook.find("David")) ;// David‘s extension: 345
    pbook.remove("David");
    pbook.showAll()

    mike - > 123
    Cynthia - > 456

二,Dictionary类的辅助方法

我们还可以定义一些在特定情况下有用的辅助方法,比如,统计字典中元素的个数

    function count() {
        var n = 0;
        for (var key in Object.keys(this.datastore)) {
            ++n;
        }
    }

此时,你可能问,为什么使用length属性,这是因为当键的类型为为字符串时,length属性就不管用了。测试:

    var nums = new Array();
    nums[0] = 1;
    nums[1] = 2;
    console.log(nums.length) //2

    pbook.add("Mike","123");
    pbook.add("David","345");

    console.log(pbook.length);//undefined

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

    function clear() {
        for each (var key in Object.keys(this.datastore)) {
            delete this.datastore[key];
        }
    }

三,为Dictionary类添加排序功能

字典的用途主要是通过键取值,我们无需太关心数据在字典中的实际存储顺序。然而,很多人希望看到一个有序的字典。下面看看如何实现字典的按顺序显示。

数组是可以排序的。

如下。

    var a = new Array();
    a[0] = "Mike";
    a[1] = "David";
    console.log(a);//["Mike", "David"]
    a.sort();
    console.log(a) //["David", "Mike"]

但是上面的这种做法在以字符串作为键的字典是无效的,程序不会有任何输出。这和我们定义count()方法时所遇到的情况是一样的。

不过,这也不是大问题,用户关心的是显示字典的内容时,结果是有序的。可以使用Object.keys()函数解决这个问题。下面是重新定义showAll()的方法。

    function showAll2() {
        for (var key in Object.keys(this.datastore).sort()) {
            console.log(key + " -> " + this.datastore[key])
        }
    }

该定义和之前定义的唯一区别是:从数组datastore拿到键后,调用sort()方法对键重新排序。

    function Dictionary() {
        this.add = add;
        this.datastore = new Array();
        this.find = find;
        this.remove  = remove;
        this.showAll = showAll;
        this.showAll2 = showAll2;
        this.count = count;
        //this.clear = clear;
    }

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

    function find(key) {
        return this.datastore[key]
    }

    function remove(key) {
        delete this.datastore[key] //delete是Object类的一部分,使用对键删掉键和与其无关的值。
    }

    function showAll() {
        for (var key in Object.keys(this.datastore)) {  //调用Object的keys()方法可以返回传入参数中储存的所有键
            console.log(key + " -> " + this.datastore[key])
        }
    }

    function showAll2() {
        for (var key in Object.keys(this.datastore).sort()) { //显示字典的内容时,结果是有序的。使用Object.keys()函数。
            console.log(key + " -> " + this.datastore[key])
        }
    }

    function count() {
        var n = 0;
        for (var key in Object.keys(this.datastore)) {
            ++n;
        }
        console.log(n)
    }

    // function clear() {
    //     for each (var key in Object.keys(this.datastore)) {
    //         delete this.datastore[key];
    //     }
    // }

    //测试
    var pbook = new Dictionary();
    pbook.add("Mike","123");
    pbook.add("David","345");
    pbook.add("Cynthia","456");
    console.log(" David‘s extension: " + pbook.find("David")) ;// David‘s extension: 345
    pbook.remove("David");
    pbook.showAll()
    pbook.count()//2
    //pbook.clear()
    pbook.showAll2()

(本章完结)

上一章:第五章:javascript:队列   下一章:第七章:javascript:散列

时间: 2024-08-04 01:56:09

第六章:javascript:字典的相关文章

第六章 javaScript执行环境和作用域

这个只是点对于初学者其实大概了解就可以,但是要研究明白javaScript的机制,就是非常必要的,这只是我的一些记录,大家参考即可,如有错误请指出. 执行环境的概念是javaScript一个虚拟的概念,如何定义它呢?它的作用又是什么呢?它是怎么组成的呢? 大家都比较认可的说法:执行环境又称为执行上下文,从实际的表现来看,可以把它理解为由“对象”组成的一个堆栈.既然是堆栈,就是先入后出了. 组成堆栈的对象是什么对象?我没有找到确切的定义,基于我自己的理解,这个对象是一个自定义对象,里边包含有变量.

《Python从入门到实践》--第六章 操作字典 课后练习

题目: 动手试一试6-1 人 :使用一个字典来存储一个熟人的信息,包括名.姓.年龄和居住的城市.该字典应包含键first_name .last_name .age 和city .将存储在该字典中的每项信息都打印出来.6-2 喜欢的数字 :使用一个字典来存储一些人喜欢的数字.请想出5个人的名字,并将这些名字用作字典中的键:想出每个人喜欢的一个数字,并将这些数字作为值存储在字典中.打印每个人的名字和喜欢的数字.为让这个程序更有趣,通过询问朋友确保数据是真实的.6-3 词汇表 :Python字典可用于

《Python从入门到实践》--第六章 操作字典 课后练习2

题目: 6-4 词汇表2 :既然你知道了如何遍历字典,现在请整理你为完成练习6-3而编写的代码,将其中的一系列print 语句替换为一个遍历字典中的键和值的循环.确定该循环正确无误后,再在词汇表中添加5个Python术语.当你再次运行这个程序时,这些新术语及其含义将自动包含在输出中.6-5 河流 :创建一个字典,在其中存储三条大河流及其流经的国家.其中一个键—值对可能是'nile': 'egypt' .使用循环为每条河流打印一条消息,如“The Nileruns throughEgypt.”.使

《javascript高级程序设计》第六章总结

6.1 理解对象 属性类型 属性特性 行为描述 数据属性 Configurable 表示是否能通过delete删除属性从而重新定义属性. 数据属性 Enumerable 表示能否通过for-in循环返回属性.对于直接在对象中定义的属性,默认为true 数据属性 Writable 表示是否可以修改属性的值. 数据属性 value 表示这个属性的内部值. 访问器属性 Configurable 表示是否能通过delete删除属性从而重新定义属性. 访问器属性 Enumerable 表示能否通过for-

JavaScript高级程序设计(第3版)第六章读书笔记

第六章 面向对象的程序设计 1. 数据属性 [[Configurable]]:表示能否通过delete删除属性从而重新定义属性.默认值为true. [[Enumerable]]:表示能否通过for-in循环返回属性.默认值为true. [[Writable]]:表示能否修改属性的值,默认为true. [[Value]]:包含这个属性的数据值.默认为undefined. 要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty( )方法.接收三个参数:属性所

读《编写可维护的JavaScript》第六章总结

第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载并等同于全局对象,因此任何在全局作用域声明的变量和函数都是windows对象的属性. 6.1 全局变量带来的问题 这个就不用照着书详谈了,当我们进入团队合作编写代码时,若大家自定义的变量都是直接挂载在windows对象上(也就是全局变量),很容易发生命名冲突.像这样: function sayCol

JavaScript学习笔记(第四章——第六章)

时间戳(2015-06-09 20:58:00) 第四章:变量.作用于和内存问题          typeof:判断元素是什么类型            instanceof:检测引用类型对象是否未指定类型          注:所有引用类型皆为Object的实例          JavaScript没有块级作用域:                    例1: if(true){ var color = “blue”; } alert(color);               // bl

[书籍翻译] 《JavaScript并发编程》第六章 实用的并发

本文是我翻译<JavaScript Concurrency>书籍的第六章 实用的并发,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. 在上一章中,我们大致学习了Web workers的基本

JavaScript DOM编程艺术-学习笔记(第五章、第六章)

第五章: 1.题外话:首先大声疾呼,"js无罪",有罪的是滥用js的那些人.js的father 布兰登-艾克,当初为了应付工作,10天就赶出了这个js,事后还说人家js是c语言和self语言"约"的产物,(百度百科说的,这些).....一个可怜的孩子-js.然后命运弄"人",js此时已世人皆知.可能是因为js的毁誉参半,它老爸才不想承认它吧.如果js会说话,它可能会给它布兰登-艾克说,"你当初怎么不把*******在墙上".这

第六章 图标介绍

Java 类相关图标介绍 ? ? 官网地址: http://www.jetbrains.com/idea/webhelp/symbols.html 对于各个图标,上图的 Description 写得非常详细,但是有几个还是需要进行特别的说明下. Source root,你可以理解为源目录,源码的作用就是用来专门放 Java 类文件,相对于编译出来的 class 文件而言,它就是源.我们一般默认名字叫 src 的目录就是源目录,但是其实并不是这样的,在 IntelliJ IDEA 中,即使叫 sr