在javascript中建立自己的集合对象
2007-11-27 17:43:14 来源:WEB开发网在JavaScript中建立自己的集合对象
集合对象——在Perl中称之为联合数组——提供了一种用来在存储器中保存和提取数据项的方法;该方法基于一种提供“关键字——数值(value)”对的数据结构上。你可以根据数据项的关键字进行插入和提取操作,每个数据项的关键字都是独有的、互不重复的。“关键字——数值”对使得集合在处理查找工作时是特别有用。另外,关键字的单值性提供标记关键字或者说检查关键字是否唯一的能力。
集合并不是一个新的概念,除了Perl之外,许多语言都支持它,如VBScript和Visual Basic。但是如果你想在JavaScript中使用集合对象,你就没那么走运了。JavaScript的5.0以及5.0之前的版本都不支持集合对象——除非你自己建立它们。我将在VBScript用集合对象来建立一个等效的模型,然后用JavaScript实现它。
看看用VBScript实现的模型
当用server-side VBScript编写代码时,我通常用集合对象来处理例行任务,如管理一个小的数据库。举例来说,假定有两个数据库表,一个用来存放某公司销售的零件现货清单,另一个用于存放生产地址,如图A所示。
Figure A
假设你必须建立一个基于Web的报表(report),其中包括零件数量、说明以及生产商地址。你可能会编写类似于下面的SQL语句。 SELECT p.part_nbr,p.description,f.name FROM tblPart p,tblFactory f WHERE p.factory_nbr = f.factory_nbr ORDER BY part_nbr ASC
是不是看起来很简单?但是假定由于某些原因,你所需要的零件信息已经存在于一个ADO记录集(recordset)。例如,你需要用零件表的信息来生成代理报表(commission report),你该怎么办呢?无论怎样,你都可以用代码清单A中的SELECT语句,或者循环查找零件记录集并对每个零件记录使用SELECT语句来获取生产商的名字。这两种方法都是可行的,不过,访问存储设备可是脚本所能实现的工作中最耗时的一种。在遇到这种情况的时候,我一般用SELECT语句获得厂商名和厂商代号的,如
SELECT factory_nbr,name FROM tblFactory用JavaScript实现自己的集合
现在你应该了解本模型如何在VBScript中工作的,现在让我们看看JavaScript是怎么实现的。正如我早先所提到的,集合对象按关键字存储数据项。在本例中,关键字为厂商代号,厂商名字为数据项。
为了易用起见,我从VBScript中选择了字典对象来作为模型,它实现了表A所示的方法。表A
方法/属性
例子
说明
add
object.add(关键字,数据项)
在集合中添加一个“关键字——数据项”对。
count
object.count
返回集合中数据项的数目。
exists
object.exists(关键字)
如果关键字存在,返回“真”,否则返回“假”。
Item
object.item(关键字, 数据项)
object.item(关键字)
把一个数据项和一个关键字对应上。
返回关键字对应的数据项。
removeAll
object.removeAll()
删除集合中所有的“关键字——数据项”对。
remove
object.remove(关键字)
删除本“关键字——数据项”对。
keys
object.keys()
返回一个包含所有关键字的数组。
为了在JavaScript中创建集合,你需要使用构造函数。在JavaScript的5.0以及更早的版本中,构造函数的书写和使用方式与Visual Basic(或者其它支持对象的语言)的类的构造函数相同。集合例化的方式考虑了构造函数的用途。构造函数的方法和属性的定义把JavaScript构造函数从JavaScript普通函数中区分开来。
在写构造函数时,你可以用关键字this来访问对象的属性和方法。构造函数的任务就是初始化对象、属性(property)以及方法。我们的集合对象来有三个属性:this.objCollection、 this.count和this.error。从清单C所摘录的代码中,我们可以看出构造函数中,属性的定义大概是个什么样子。
清单C:this.objcollection = new Object; // Associative array
this.count = 0; // Total numbers of items
this.error = false; // Error indicator
除了包括这三个属性外,我们的这个集合对象还拥有六个方法:this.add、 this.exists、 this.item、this.removeAll、 this.remove以及this.keys。这些方法的定义与属性的定义方法相似,区别在于:方法的目的在于揭示函数。所以在add方法中,你需要清单D所示的代码。
清单D:this.add = colAdd; // Add method
void function colAdd(strKey,strItem) {
/* Function: colAdd
Creation Date: August 16, 2002
Programmer: Edmond Woychowsky
Purpose: The purpose of this function is to add an item to the collection object.
Update Date: Programmer: Description:
*/
this.error = false; // Default successful
if(typeof(this.objcollection[strKey]) == undefined) {
++this.count;
this.objcollection[strKey] = strItem;
} else
this.error = true; // Error
}
类似与add方法,其它方法也需要它们自己的定义和函数。一旦完成这些方法的定义和函数,我们可以试一试我们的集合对象。为了简明起见,我将跳过其它函数方法的定义过程而简单的介绍JavaScript的新建集合对象的方法。第一个任务就是建立一个本对象的实例:
var colFactory = new collection(); // 建立一个实例
一旦建立了集合对象的实例,添加数据项就是一件简单的事情了。回到前面的报表例子,填写集合的任务可以用清单E中的几行代码轻松搞定。
while(!rstFty.EOF) {
colFactory.add(rstFty.Field(factory_nbr).Value,rstFty.Field(name).Value);
rstFty.MoveNext
}
你可以只用一行代码就可以获得厂商名字:
strFactoryName = colFactory.item(strFactoryNumber);
总结
通过用VBScript来建模的优势,你可以建立自己的集合对象以弥补JavaScrpt不支持集合对象的缺点。只需以少量代码为代价,你就可以在JavaScript中使用集合了。
- ››自己写的一个php基于phpQuery的通用采集类
- ››建立唯美图片特效,十个jQuery插件分享
- ››自己动手写iPhone wap浏览器之界面架构篇
- ››建立自己的TextView和ImageView的组合View类
- ››自己也能DIY个性真人QQ表情
- ››自己动手!巧法让酷狗动感歌词更完美
- ››自己编译Google Android内核的Linux源码
- ››自己写的一个jquery模板引擎(json比较好用)
- ››自己定义Android堆内存大小
- ››建立虚拟专用网 使用SSH保护网络通信
- ››自己动手制作伪原创程序 分为八个步骤
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
更多精彩
赞助商链接