WEB开发网
开发学院网页设计JavaScript 在javascript中建立自己的集合对象 阅读

在javascript中建立自己的集合对象

 2007-11-27 17:43:14 来源:WEB开发网   
核心提示:在JavaScript中建立自己的集合对象集合对象——在Perl中称之为联合数组——提供了一种用来在存储器中保存和提取数据项的方法;该方法基于一种提供“关键字——数值(value)”对的数据结构上,你可以根据数据项的关键字进行插入和提取操作,在javascript中建立自己的集合对象,每个数据项的关键字都是独有

在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.objCollectionthis.countthis.error。从清单C所摘录的代码中,我们可以看出构造函数中,属性的定义大概是个什么样子。

清单C

:this.objcollection = new Object;  //   Associative array
 this.count = 0;              //   Total numbers of items
 this.error = false;        //   Error indicator

除了包括这三个属性外,我们的这个集合对象还拥有六个方法:this.addthis.existsthis.itemthis.removeAllthis.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中的几行代码轻松搞定。

清单E:

while(!rstFty.EOF) {

 colFactory.add(rstFty.Field(factory_nbr).Value,rstFty.Field(name).Value);
    rstFty.MoveNext
 }

你可以只用一行代码就可以获得厂商名字:
strFactoryName = colFactory.item(strFactoryNumber);

总结

通过用VBScript来建模的优势,你可以建立自己的集合对象以弥补JavaScrpt不支持集合对象的缺点。只需以少量代码为代价,你就可以在JavaScript中使用集合了。

Tags:avascript 建立 自己

编辑录入:coldstar [复制链接] [打 印]
赞助商链接