第六章: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) // 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()//
//pbook.clear()
pbook.showAll2()
(本章完结)
上一章:第五章:javascript:队列 下一章:第七章:javascript:散列
第六章:javascript:字典的更多相关文章
- Python编程:从入门到实践——【作业】——第六章(字典)
第六章作业 6-1 人 : 使用一个字典来存储一个熟人的信息, 包括名. 姓. 年龄和居住的城市. 该字典应包含键first_name . last_name . age 和city . 将存储在该字 ...
- 《Python编程从入门到实践》_第六章_字典
一个简单的字典 #用户信息 user = {','city':'shanghai'} print(user['name']) print(user['age']) print(user['city'] ...
- python编程:从入门到实践----第六章:字典>练习
6-1 人:使用一个字典来存储一个熟人的信息,包括名.姓.年龄和居住的城市.该字典应包含键first_name .last_name .age 和city .将存储在该字典中的每项信息都打印出来. f ...
- 为什么我要放弃javaScript数据结构与算法(第六章)—— 集合
前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...
- 读《编写可维护的JavaScript》第六章总结
第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...
- 《Javascript高级程序设计》阅读记录(六):第六章 下
这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...
- [书籍翻译] 《JavaScript并发编程》第六章 实用的并发
本文是我翻译<JavaScript Concurrency>书籍的第六章 实用的并发,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript ...
- JavaScript DOM编程艺术-学习笔记(第五章、第六章)
第五章: 1.题外话:首先大声疾呼,"js无罪",有罪的是滥用js的那些人.js的father 布兰登-艾克,当初为了应付工作,10天就赶出了这个js,事后还说人家js是c语言和s ...
- JavaScript高级程序设计:第六章
第六章 面向对象的程序设计 一.理解对象 1.属性类型: ECMAScript中有两种属性:数据属性和访问器属性. (1)数据属性: 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性 ...
- KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器
无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...
随机推荐
- Maven使用笔记,错误Failure to Transfer后处理
当有未更新成功的项,M3会以后缀为.lastUpdated保存未更新成功的项 执行下面的操作可清楚这些项 Unixfind ~/.m2 -name "*.lastUpdated" ...
- Ubuntu 14.04(32位)安装Oracle 11g(32位)全过程
1.将系统更新到最新:sudo apt-get updatesudo apt-get dist-upgrade2.安装Oracle所需的依赖包:sudo apt-get install automak ...
- C++中对象初始化
在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...
- 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收
前言:上一篇文章 只是 RabbitMQ 的科普,本文将仔细分析 Cinder 中 RabbitMQ 的各组件的使用.消息的发送和接收等.由于各流程步骤很多,本文只会使用若干流程图来加以阐述,尽量做到 ...
- 【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取
打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码, ...
- bootstrap学习总结-css组件(三)
今天我们来看看css组件效果以及其中比较重要的类,这些类都不难,关键要熟练掌握,搭配使用,灵活运用.关于前两篇中,css样式和布局的文章,大家可以在首页进行阅读.http://www.cnblogs. ...
- esc设置多站点 域名解析
你的域名是:a.com IP: 1.1.1.1 一 设置域名解析: 1.a.com 解析到 1.1.1.1 2.a.com 解析到 2.2.2.2 LOOP 二 到服务器上: 在1站点设置主机 ...
- S2小测--索引--视图
1. 关于Sql server 视图 视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询.视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目 标.理论上它可以像普通的物理表一 ...
- Java NIO 概述
Channel 和 Buffer 标准的Java IO编程接口是面向字节流和字符流的 而 NIO 是面向通道和缓冲区的 数据总是从通道中读到Buffer中,或者从Buffer写入通道中 NIO可以理解 ...
- 一道看似简单的sql需求却难倒各路高手 - 你也来挑战下吗?
转自:http://www.cnblogs.com/keguangqiang/p/4535046.html 听说这题难住大批高手,你也来试下吧.ps:博问里的博友提出的. 原始数据 select * ...