company logo
advertisement for deep fried Twinkies


处理数组


 

常见数组任务

本章介绍了以下常见的数组使用活动:

  • 创建索引数组
  • 添加和删除数组元素
  • 对数组元素进行排序
  • 提取数组的某些部分
  • 处理关联数组和字典
  • 处理多维数组
  • 复制数组元素
  • 创建数组子类

重要概念和术语

以下参考列表包含将会在本章中遇到的重要术语:

  • 数组 (Array):用作容器以将多个对象组合在一起的对象。
  • 关联数组 (Associative array):使用字符串键来标识各个元素的数组。
  • 字典 (Dictionary):其项目由一对对象(称为键和值)组成的数组。它使用键来标识单个元素,而不是使用数字索引。
  • 元素 (Element):数组中的单个项目。
  • 索引 (Index):用于标识索引数组中的单个元素的数字"地址"。
  • 索引数组 (Indexed array):这是一种标准类型的数组,它将每个元素存储在编号元素中,并使用数字(索引)来标识各个元素。
  • 键 (Key):用于标识关联数组或字典中的单个元素的字符串或对象。
  • 多维数组 (Multidimensional array):此数组包含的项目是数组,而不是单个值。

索引数组

索引数组存储一系列经过组织的单个或多个值,其中的每个值都可以通过使用一个无符号整数值进行访问。第一个索引始终是数字 0,且添加到数组中的每个后续元素的索引以 1 为增量递增。正如以下代码所示,可以调用 Array 类构造函数或使用数组文本初始化数组来创建索引数组:

// 使用 Array 构造函数。
var myArray:Array = new Array();
myArray.push("one");
myArray.push("two");
myArray.push("three");
trace(myArray); // 输出:one,two,three

// 使用数组文本。
var myArray:Array = ["one", "two", "three"];
trace(myArray); // 输出:one,two,three

Array 类中还包含可用来修改索引数组的属性和方法。这些属性和方法几乎是专用于索引数组而非关联数组的。

索引数组使用无符号 32 位整数作为索引号。索引数组的最大大小为 232-1,即 4,294,967,295。如果要创建的数组大小超过最大值,则会出现运行时错误。

数组元素的值可以为任意数据类型。ActionScript 3.0 不支持"指定类型的数组"概念,也就是说,不能指定数组的所有元素都属于特定数据类型

创建数组

Array 构造函数的使用有三种方式。第一种,如果调用不带参数的构造函数,会得到空数组。可以使用 Array 类的 length 属性来验证数组是否不包含元素。例如,以下代码调用不带参数的 Array 构造函数:

var names:Array = new Array();
trace(names.length); // 输出:0

第二种,如果将一个数字用作 Array 构造函数的唯一参数,则会创建长度等于此数值的数组,并且每个元素的值都设置为 undefined。参数必须为介于值 0 和 4,294,967,295 之间的无符号整数。例如,以下代码调用带有一个数字参数的 Array 构造函数:

var names:Array = new Array(3);
trace(names.length); // 输出:3
trace(names[0]); // 输出:undefined
trace(names[1]); // 输出:undefined
trace(names[2]); // 输出:undefined

第三种,如果调用构造函数并传递一个元素列表作为参数,将创建具有与每个参数对应的元素的数组。以下代码将三个参数传递给 Array 构造函数:

var names:Array = new Array("John", "Jane", "David");
trace(names.length); // 输出:3
trace(names[0]); // 输出:John
trace(names[1]); // 输出:Jane
trace(names[2]); // 输出:David

也可以创建具有数组文本或对象文本的数组。可以将数组文本直接分配给数组变量,如以下示例所示:

var names:Array = ["John", "Jane", "David"];

插入数组元素

可以使用 Array 类的三种方法(push()unshift()splice())将元素插入数组。push() 方法用于

在数组末尾添加一个或多个元素。换言之,使用 push() 方法在数组中插入的最后一个元素将具有最大

索引号。unshift() 方法用于在数组开头插入一个或多个元素,并且始终在索引号 0 处插入。splice()

方法用于在数组中的指定索引处插入任意数目的项目。

下面的示例对所有三种方法进行了说明。它创建一个名为 planets 的数组,以便按照距离太阳的远近顺

序存储各个行星的名称。首先,调用 push() 方法以添加初始项 Mars。接着,调用 unshift() 方法在

数组开头插入项 Mercury。最后,调用 splice() 方法在 Mercury 之后和 Mars 之前插入项 Venus

Earth。传递给 splice() 的第一个参数是整数 1,它用于指示从索引 1 处开始插入。传递给 splice

() 的第二个参数是整数 0,它表示不应删除任何项。传递给 splice() 的第三和第四个参数 Venus

Earth 为要插入的项。

var planets:Array = new Array();
planets.push("Mars");          // 数组内容:Mars
planets.unshift("Mercury"); // 数组内容:Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets);                // 数组内容:Mercury,Venus,Earth,Mars
        

push()unshift() 方法均返回一个无符号整数,它们表示修改后的数组长度。在用于插入元素时,

        

splice() 方法返回空数组,这看上去也许有点奇怪,但考虑到 splice() 方法的多用途性,您便会觉得

        

它更有意义。通过使用 splice() 方法,不仅可以将元素插入到数组中,而且还可以从数组中删除元素。

        

用于删除元素时,splice() 方法将返回包含被删除元素的数组。

        

删除数组元素

        

可以使用 Array 类的三种方法(pop()shift()splice())从数组中删除元素。pop() 方法用于

        

从数组末尾删除一个元素。换言之,它将删除位于最大索引号处的元素。shift() 方法用于从数组开头

        

删除一个元素,也就是说,它始终删除索引号 0 处的元素。splice() 方法既可用来插入元素,也可以

        

删除任意数目的元素,其操作的起始位置位于由发送到此方法的第一个参数指定的索引号处。

        

以下示例使用所有三种方法从数组中删除元素。它创建一个名为 oceans 的数组,以便存储较大水域的

        

名称。数组中的某些名称为湖泊的名称而非海洋的名称,因此需要将其删除。

        

首先,使用 splice() 方法删除项 AralSuperior,并插入项 AtlanticIndian。传递给

        

splice() 的第一个参数是整数 2,它表示应从列表中的第三个项(即索引 2 处)开始执行操作。第二

        

个参数 2 表示应删除两个项。其余两个参数 AtlanticIndian 是要在索引 2 处插入的值。

        

然后,使用 pop() 方法删除数组中的最后一个元素 Huron。最后,使用 shift() 方法删除数组中的第一

        

个项 Victoria

        
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // 替换 Aral 和 Superior
oceans.pop();      // 删除 Huron
oceans.shift(); // 删除 Victoria
trace(oceans);     // 输出:Pacific,Arctic,Atlantic,Indian
        

pop()shift() 方法均返回已删除的项。由于数组可以包含任意数据类型的值,因而返回值的数据类型

        

为 Object。splice() 方法将返回包含被删除值的数组。可以更改 oceans 数组示例,以使 splice()

        

用将此数组分配给新的数组变量,如以下示例所示:

        
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // 输出:Aral,Superior
        

您可能会遇到这样的代码,它在数组元素上使用 delete 运算符。delete 运算符用于将数组元素的值设置

        

undefined,但它不会从数组中删除元素。例如,下面的代码在 oceans 数组的第三个元素上使用

        

delete 运算符,但此数组的长度仍然为 5:

        
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
trace(oceans); // 输出:Arctic,Pacific,,Indian,Atlantic
delete oceans[2];          
trace(oceans[2]);        // 输出:undefined
trace(oceans.length); // 输出:5
        

可以使用数组的 length 属性截断数组。如果将数组的 length 属性设置为小于数组当前长度的值,则会截

        

断数组,在索引号高于 length 的新值减 1 处所存储的任何元素将被删除。例如,如果 oceans 数组的排序

        

是将所有有效项放在数组的开始处,则可以使用 length 属性删除数组末尾的项,如以下代码所示:

        
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // 输出:Arctic,Pacific