索引数组

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

索引数组存储一系列经过组织的单个或多个值,其中的每个值都可以通过使用一个无符号整数值进行访问。第一个索引始终是数字 0,且添加到数组中的每个后续元素的索引以 1 为增量递增。在 ActionScript 3.0 中,有两个类可用作索引数组:Array 类和 Vector 类。

索引数组使用无符号 32 位整数作为索引号。索引数组的最大大小为 2 32 - 1,即 4,294,967,295。如果尝试创建超过该最大大小的数组,则会导致运行时错误。

若要访问索引数组中的单个元素,请使用数组访问 ( [] ) 运算符指定要访问的元素的索引位置。例如,下面的代码表示名为 songTitles 的索引数组中的第一个元素(位于索引 0 处的元素):

songTitles[0]

数组变量名称后跟索引(在中括号中)的组合用作一个标识符。(换句话说,可以按照变量名称的任何使用方式来使用这个组合)。可以在赋值语句左侧使用名称和索引来向索引数组元素赋值。

songTitles[1] = "Symphony No. 5 in D minor";

同样,可以在赋值语句右侧使用名称和索引来检索索引数组元素的值。

var nextSong:String = songTitles[2];

您还可以在中括号中使用变量而不是提供显式值。(变量必须包含一个非负整数值,如 uint、正 int 或正整数 Number 实例)。此方法通常用于“循环访问”索引数组中的元素,并对某些元素或所有元素执行操作。下面的代码清单演示了这种方法。这段代码使用循环来访问名为 oddNumbers 的 Array 对象中的每个值。它使用 trace() 语句以“oddNumber[ index ] = value ”的形式输出每个值:

var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; 
var len:uint = oddNumbers.length; 
for (var i:uint = 0; i < len; i++) 
{ 
    trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString()); 
}

Array 类

索引数组的第一个类型为 Array 类。Array 实例的值可以为任意数据类型。同一 Array 对象中包含的对象可以具有不同的数据类型。例如,一个 Array 实例可以在索引 0 处有 String 值,在索引 1 处有 Number 实例,而在索引 2 处有 XML 对象。

Vector 类

ActionScript 3.0 中可用的另一种索引数组类型为 Vector 类。Vector 实例是“指定类型的数组”,这表示 Vector 实例中的所有元素始终具有同一数据类型。

注: 从 Flash Player 10 和 Adobe AIR 1.5 开始提供 Vector 类。

在声明 Vector 变量或实例化 Vector 对象时,要明确指定 Vector 可以包含的对象的数据类型。指定的数据类型称为 Vector 的“基本类型”。在运行时和编译时(在严格模式下),会检查任何设置 Vector 元素的值或从 Vector 检索值的代码。如果要添加或检索的对象的数据类型与 Vector 的基本类型不匹配,则会发生错误。

除数据类型限制之外,Vector 类还具有一些其他限制,从而有别于 Array 类:

  • Vector 是一种密集数组。即使某个 Array 对象在位置 1 到 6 没有值,该对象的索引 0 和 7 处也可以有值。但是,Vector 的每个索引位置都必须有值(或为 null )。

  • Vector 还可以是固定长度。这表示 Vector 包含的元素数不能更改。

  • 对 Vector 的元素的访问需要接受范围检查。绝对不能从大于最后一个元素索引 ( length - 1) 的索引中读取值。绝对不能对超过当前最后一个索引一个以上位置的索引设置值(也就是说,只能在现有索引或索引 [length] 处设置值)。

由于 Vector 具有这些限制,因此 Vector 相对于所有元素均为单个类的实例的 Array 实例有三个主要优点:

  • 性能:使用 Vector 实例时的数组元素访问和迭代的速度比使用 Array 实例时的速度要快很多。

  • 类型安全性:在严格模式下,编译器可以识别数据类型错误。这类错误的例子包括将数据类型错误的值分配给 Vector 或从 Vector 中读取值时使用错误的数据类型。在运行时,当向 Vector 对象添加数据或从 Vector 对象读取数据时也会检查数据类型。但请注意,当使用 push() 方法或 unshift() 方法向 Vector 添加值时,在编译时不会检查参数的数据类型。不过在使用这些方法时,仍会在运行时检查值。

  • 可靠性:与 Array 相比,运行时范围检查(或固定长度检查)大大提高了可靠性。

除了有一些限制和优点以外,Vector 类与 Array 类非常相似。Vector 对象的属性和方法与 Array 的属性和方法类似(大多数情况下完全相同)。对于大多数需要使用所有元素都具有相同数据类型的 Array 的情况,Vector 实例更为可取。

创建数组

可以使用多种方法来创建 Array 实例或 Vector 实例。但是,创建每种数组类型的方法多少有些不同。

创建 Array 实例

可以通过调用 Array() 构造函数或使用 Array 文本语法来创建 Array 对象。

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

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

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

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

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

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

也可以使用 Array 文本创建数组。可以将 Array 文本直接分配给数组变量,如下面的示例所示:

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

创建 Vector 实例

可以通过调用 Vector.<T>() 构造函数创建 Vector 实例。还可以通过调用 Vector.<T>() 全局函数创建 Vector。该函数将指定对象转换为 Vector 实例。在 Flash Professional CS5 和更高版本、Flash Builder 4 和更高版本以及 Flex 4 和更高版本中,还可以使用 Vector 文本语法创建 Vector 实例。

只要声明 Vector 变量(Vector 方法参数或方法返回类型也一样),就需要指定 Vector 变量的基本类型。在通过调用 Vector.<T>() 构造函数创建 Vector 实例。换句话说,只要在 ActionScript 中使用术语 Vector ,就需要指定基本类型。

可以使用 type 参数语法指定 Vector 的基本类型。在代码中,类型参数紧跟单词 Vector 。它包括一个点 ( . ),然后是由尖括号 ( <> ) 括起来的基类名称,如此示例中所示:

var v:Vector.<String>; 
v = new Vector.<String>();

在此示例的第一行内容中,变量 v 声明为 Vector. <String> 实例。换句话说,它表示只能包含 String 实例的索引数组。第二行调用 Vector() 构造函数创建一个具有相同 Vector 类型的实例(也就是其中所有元素都是 String 对象的 Vector)。该示例将该对象分配给 v

使用 Vector.<T>() 构造函数

如果使用不带任何参数的 Vector.<T>() 构造函数,则该函数会创建一个空的 Vector 实例。可以通过检查 Vector 的 length 属性来测试它是否为空。例如,下面的代码调用不带任何参数的 Vector.<T>() 构造函数:

var names:Vector.<String> = new Vector.<String>(); 
trace(names.length); // output: 0

如果您预先知道 Vector 最初需要多少元素,则可以预定义 Vector 中的元素数。若要使用特定数量的元素创建 Vector,请将元素数作为第一个参数( length 参数)进行传递。因为 Vector 元素不能为空,所以会使用具有基本类型的实例填充这些元素。如果基本类型是允许使用 null 值的引用类型,则所有元素都包含 null 。否则,所有元素都包含该类的默认值。例如,uint 变量不能为 null 。因此,在下面的代码清单中,使用七个元素创建名为 ages 的 Vector,其中每个元素都包含值 0:

var ages:Vector.<uint> = new Vector.<uint>(7); 
trace(ages); // output: 0,0,0,0,0,0,0 

最后,还可以使用 Vector.<T>() 构造函数创建固定长度 Vector,方法是将 true 作为第二个参数( fixed 参数)进行传递。在这种情况下,将使用指定的元素数创建 Vector,且元素数不可更改。但是请注意,仍然可以更改固定长度 Vector 的元素值。

使用 Vector 文本语法构造函数

在 Flash Professional CS5 和更高版本、Flash Builder 4 和更高版本以及 Flex 4 和更高版本中,可以向 Vector.<T>() 构造函数传递值列表来指定 Vector 的初始值:

// var v:Vector.<T> = new <T>[E0, ..., En-1 ,]; 
// For example: 
var v:Vector.<int> = new <int>[0,1,2,];

下列信息适用于此语法:

  • 尾部的逗号是可选的。

  • 数组中不支持空项目;类似 var v:Vector.<int> = new <int>[0,,2,] 的语句会引发编译器错误。

  • 无法为 Vector 实例指定默认长度。该长度与初始化列表中的元素数相同。

  • 无法指定 Vector 实例是否具有固定长度。应使用 fixed 属性。

  • 如果作为值传递的项目与指定类型相匹配,则可能会发生数据丢失或出现错误。例如:
    var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode 
    trace(v[0]); //returns 4 when not running in strict mode

使用 Vector.<T>() 全局函数

除了 Vector.<T>() 和 Vector 文本语法构造函数之外,还可以使用 Vector.<T>() 全局函数创建 Vector 对象。 Vector.<T>() 全局函数是一个转换函数。当调用 Vector.<T>() 全局函数时,需指定该方法返回的 Vector 的基本类型。可将单个索引数组(Array 或 Vector 实例)作为参数进行传递。该方法随后返回具有指定基本类型的 Vector,其中包含源数组参数中的值。下面的代码清单演示了用于调用 Vector.<T>() 全局函数的语法:

var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);

Vector.<T>() 全局函数在两个级别上执行数据类型转换。首先,当 Array 实例传递给该函数时,会返回 Vector 实例。其次,无论源数组是 Array 还是 Vector 实例,该函数都会试图将源数组的元素转换为基本类型的值。该转换使用标准 ActionScript 数据类型转换规则。例如,下面的代码清单将源 Array 中的 String 值转换为结果 Vector 中的整数。第一个值(“1.5”)的小数部分被截断,非数字的第三个值(“Waffles”)在结果中转换为 0:

var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]); 
trace(numbers); // output: 1,17,0

如果无法转换任何源元素,则会发生错误。

当代码调用 Vector.<T>() 全局函数时,如果源数组中的某个元素是指定基本类型的子类的实例,则该元素会添加到结果 Vector 中(不发生错误)。只有使用 Vector.<T>() 全局函数才能将基本类型为 T 的 Vector 转换为基本类型为 T 的超类的 Vector。

插入数组元素

用于将元素添加到索引数组的最基本方法是使用数组访问 ( [] ) 运算符。若要设置索引数组元素的值,请在赋值语句的左侧使用 Array 或 Vector 对象名称和索引编号:

songTitles[5] = "Happy Birthday";

如果 Array 或 Vector 在该索引处还没有元素,则会创建该索引并将值存储在那里。如果该索引处存在值,则新值会替换现有值。

Array 对象允许您在任何索引位置创建元素。但是对于 Vector 对象,您只能向现有索引或下一个可用索引赋值。下一个可用索引对应于 Vector 对象的 length 属性。向 Vector 对象添加新元素的最安全方式是使用类似于下面的清单的代码:

myVector[myVector.length] = valueToAdd;

可以使用 Array 和 Vector 类的三种方法( 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"); // array contents: Mars 
planets.unshift("Mercury"); // array contents: Mercury,Mars 
planets.splice(1, 0, "Venus", "Earth"); 
trace(planets); // array contents: Mercury,Venus,Earth,Mars

push() unshift() 方法均返回一个无符号整数,它们表示修改后的数组长度。在用于插入元素时, splice() 方法返回空数组,这看上去也许有点奇怪,但考虑到 splice() 方法的多用途性,您便会觉得这样更有意义。通过使用 splice() 方法,不仅可以将元素插入到数组中,而且还可以从数组中删除元素。用于删除元素时, splice() 方法将返回包含被删除元素的数组。

注: 如果某个 Vector 对象的 fixed 属性为 true ,则不能更改该 Vector 中的元素数。如果尝试使用此处介绍的方法向固定长度 Vector 添加新元素,则会发生错误。

检索值和删除数组元素

用于检索索引数组中的元素值的最简单方法是使用数组访问 ( [] ) 运算符。若要检索索引数组元素的值,请在赋值语句的右侧使用 Array 或 Vector 对象名称和索引编号:

var myFavoriteSong:String = songTitles[3];

可以尝试使用不存在元素的位置的索引来检索 Array 或 Vector 中的值。在这种情况下,Array 对象返回未定义的值,而 Vector 会引发 RangeError 异常。

可以使用 Array 和 Vector 类的三种方法( pop() shift() splice() )删除元素。 pop() 方法用于从数组末尾删除一个元素。换言之,它将删除位于最大索引号处的元素。 shift() 方法用于从数组开头删除一个元素,也就是说,它始终删除索引号 0 处的元素。 splice() 方法既可用来插入元素,也可以删除任意数目的元素,其操作的起始位置位于由发送到此方法的第一个参数指定的索引号处。

下面的示例使用所有三种方法从 Array 实例中删除元素。该示例创建一个名为 oceans 的 Array,用于存储较大水域的名称。Array 中的某些名称为湖泊的名称而非海洋的名称,因此需要将其删除。

首先,使用 splice() 方法删除项 Aral Superior ,并插入项 Atlantic Indian 。传递给 splice() 的第一个参数是整数 2,它指示应从列表中的第三个项(即索引 2 处)开始执行操作。第二个参数 2 指示应删除两个项。其余两个参数 Atlantic Indian 是要在索引 2 处插入的值。

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

var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; 
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior 
oceans.pop(); // removes Huron 
oceans.shift(); // removes Victoria 
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian

pop() shift() 方法均返回已删除的项。对于 Array 实例,由于数组可以包含任意数据类型的值,因而返回值的数据类型为 Object。对于 Vector 实例,返回值的数据类型是 Vector 的基本类型。 splice() 方法返回包含所删除的值的 Array 或 Vector。可以更改 oceans Array 示例,以使 splice() 调用将返回的 Array 分配给新的 Array 变量,如下面的示例所示:

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

您可能会遇到对 Array 对象元素使用 delete 运算符的代码。 delete 运算符会将 Array 元素的值设置为 undefined ,但它不会从 Array 中删除元素。例如,下面的代码对 oceans Array 中的第三个元素使用 delete 运算符,但此 Array 的长度仍然为 5:

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

可以使用数组的 length 属性截断 Array 或 Vector。如果您将某个索引数组的 length 属性设置为小于该数组的当前长度的长度,则该数组会被截断,从而删除存储在比 length 的新值减 1 大的索引编号处的所有元素。例如,如果 oceans 数组进行了排序,以使所有有效项都位于数组开头,则可以使用 length 属性删除位于数组后部的项,如下面的代码所示:

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; 
oceans.length = 2; 
trace(oceans); // output: Arctic,Pacific
注: 如果某个 Vector 对象的 fixed 属性为 true ,则不能更改该 Vector 中的元素数。如果尝试使用此处介绍的方法删除固定长度 Vector 中的元素或截断固定长度 Vector,则会发生错误。

对数组排序

可以使用三种方法( reverse() sort() sortOn() )通过排序或反向排序来更改索引数组的顺序。所有这些方法都用来修改现有数组。下表概述了这些方法及其针对 Array 和 Vector 对象的行为:

方法

Array 行为

Vector 行为

reverse()

更改元素的顺序,使最后一个元素变为第一个元素,倒数第二个元素变为第二个元素,依此类推。

与 Array 行为相同

sort()

用于按照各种预定义的方式对 Array 的元素进行排序(如字母顺序或数字顺序)。还可以指定自定义排序算法。

根据您指定的自定义排序算法对元素进行排序

sortOn()

用于对具有一个或多个公共属性的对象进行排序,排序时指定这样的属性作为排序键

在 Vector 类中不可用

reverse() 方法

reverse() 方法不带参数,也不返回值,但可以将数组从当前顺序切换为相反顺序。以下示例颠倒了 oceans 数组中列出的海洋顺序:

var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; 
oceans.reverse(); 
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

使用 sort() 方法的基本排序(仅适用于 Array 类)

对于 Array 实例, sort() 方法按照“默认排序顺序”重新排列数组中的元素。默认排序顺序具有以下特征:

  • 排序区分大小写,也就是说大写字符优先于小写字符。例如,字母 D 优先于字母 b。

  • 排序按照升序进行,也就是说低位字符代码(例如 A)优先于高位字符代码(例如 B)。

  • 排序将相同的值互邻放置,并且不区分顺序。

  • 排序基于字符串,也就是说,在比较元素之前,先将其转换为字符串(例如,10 优先于 3,因为相对于字符串 "3" 而言,字符串 "1" 具有低位字符代码)。

您也许需要不区分大小写或者按照降序对 Array 进行排序,或者您的数组中包含数字,从而需要按照数字顺序而非字母顺序进行排序。Array 类的 sort() 方法具有 options 参数,可通过该参数改变默认排序顺序的各个特征。options 是由 Array 类中的一组静态常量定义的,如以下列表所示:

  • Array.CASEINSENSITIVE :此选项可使排序不区分大小写。例如,小写字母 b 优先于大写字母 D。

  • Array.DESCENDING :用于颠倒默认的升序排序。例如,字母 B 优先于字母 A。

  • Array.UNIQUESORT :如果发现两个相同的值,此选项将导致排序中止。

  • Array.NUMERIC :这会导致排序按照数字顺序进行,比方说 3 优先于 10。

以下示例重点说明了这些选项中的某些选项。它创建一个名为 poets 的 Array,并使用几种不同的选项对其进行排序。

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; 
poets.sort(); // default sort 
trace(poets); // output: Angelou,Blake,Dante,cummings 
 
poets.sort(Array.CASEINSENSITIVE); 
trace(poets); // output: Angelou,Blake,cummings,Dante 
 
poets.sort(Array.DESCENDING); 
trace(poets); // output: cummings,Dante,Blake,Angelou 
 
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options 
trace(poets); // output: Dante,cummings,Blake,Angelou

使用 sort() 方法的自定义排序(适用于 Array 和 Vector 类)

除了可用于 Array 对象的基本排序之外,您还可以定义自定义排序规则。此方法是可用于 Vector 类的唯一一种形式的 sort() 方法。若要定义自定义排序,请编写自定义排序函数,并将该函数作为参数传递给 sort() 方法。

例如,如果有一个名称列表,其中每个列表元素都包含一个人的全名,但现在要按照姓氏对列表排序,则必须使用自定义排序函数分析每个元素,并在排序函数中使用姓氏。下面的代码说明如何使用作为参数传递给 Array.sort() 方法的自定义函数来完成上述工作:

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); 
function orderLastName(a, b):int 
{ 
    var lastName:RegExp = /\b\S+$/; 
    var name1 = a.match(lastName); 
    var name2 = b.match(lastName); 
    if (name1 < name2) 
    { 
        return -1; 
    } 
    else if (name1 > name2) 
    { 
        return 1; 
    } 
    else 
    { 
        return 0; 
    } 
} 
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones 
names.sort(orderLastName); 
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith

自定义排序函数 orderLastName() 使用正则表达式从每个元素中提取姓,以用于比较操作。针对 names 数组调用 sort() 方法时,函数标识符 orderLastName 用作唯一的参数。排序函数接受两个参数 a b ,因为它每次对两个数组元素进行操作。排序函数的返回值指示应如何对元素排序:

  • 返回值 -1 指示第一个参数 a 优先于第二个参数 b

  • 返回值 1 指示第二个参数 b 优先于第一个参数 a

  • 返回值为 0 指示元素具有相同的排序优先级。

sortOn() 方法(仅适用于 Array 类)

sortOn() 方法是为具有包含对象的元素的 Array 对象设计的。这些对象应至少具有一个可用作排序键的公共属性。如果将 sortOn() 方法用于任何其他类型的数组,则会产生意外结果。

注: Vector 类不包含 sortOn() 方法。此方法仅用于 Array 对象。

下面的示例修改 poets Array,以使每个元素均为对象而非字符串。每个对象既包含诗人的姓氏又包含诗人的出生年份。

var poets:Array = new Array(); 
poets.push({name:"Angelou", born:"1928"}); 
poets.push({name:"Blake", born:"1757"}); 
poets.push({name:"cummings", born:"1894"}); 
poets.push({name:"Dante", born:"1265"}); 
poets.push({name:"Wang", born:"701"});

可以使用 sortOn() 方法,按照 born 属性对 Array 进行排序。 sortOn() 方法定义两个参数 fieldName options 。必须将 fieldName 参数指定为字符串。在以下示例中,使用两个参数 "born" Array.NUMERIC 来调用 sortOn() Array.NUMERIC 参数用于确保按照数字顺序进行排序,而不是按照字母顺序。即使所有数字具有相同的数位,这也是一种很好的做法,因为当后来在数组中添加较少数位或较多数位的数字时,它会确保排序如期继续进行。

poets.sortOn("born", Array.NUMERIC); 
for (var i:int = 0; i < poets.length; ++i) 
{ 
    trace(poets[i].name, poets[i].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

在不修改原始数组的情况下进行排序(仅适用于 Array 类)

通常, sort() sortOn() 方法用于修改 Array。如果要对 Array 排序而又不修改现有数组,请将 Array.RETURNINDEXEDARRAY 常量作为 options 参数的一部分进行传递。此选项将指示方法返回反映排序的新 Array,同时保留原始 Array 原封不动。方法返回的 Array 为由反映新排序顺序的索引号组成的简单 Array,不包含原始 Array 的任何元素。例如,若要根据出生年份对 poets Array 排序而不修改该 Array,请在为 options 形参传递的实参中包括 Array.RETURNINDEXEDARRAY 常量。

下面的示例将返回的索引信息存储在名为 indices 的 Array 中,然后使用 indices 数组和未修改的 poets 数组按出生年份的顺序输出诗人:

var indices:Array; 
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY); 
for (var i:int = 0; i < indices.length; ++i) 
{ 
    var index:int = indices[i]; 
    trace(poets[index].name, poets[index].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

查询数组

Array 和 Vector 类的四种方法 concat() join() slice() toString() 均可用于查询数组的信息,而不修改数组。 concat() slice() 方法返回新数组;而 join() toString() 方法返回字符串。 concat() 方法将新数组和元素列表作为参数,并将其与现有数组结合起来创建新数组。 slice() 方法有两个名为 startIndex endIndex 的参数,并返回一个新数组,新数组中包含从现有数组“分离”的元素副本。分离从 startIndex 处的元素开始,到 endIndex 处的前一个元素结束。值得强调的是, endIndex 处的元素不包括在返回值中。

以下示例通过 concat() slice() 方法,使用其他数组的元素创建新数组:

var array1:Array = ["alpha", "beta"]; 
var array2:Array = array1.concat("gamma", "delta"); 
trace(array2); // output: alpha,beta,gamma,delta 
 
var array3:Array = array1.concat(array2); 
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta 
 
var array4:Array = array3.slice(2,5); 
trace(array4); // output: alpha,beta,gamma

可以使用 join() toString() 方法查询数组,并将其内容作为字符串返回。如果 join() 方法没有使用参数,则这两个方法的行为相同,它们都返回一个字符串,其中包含数组中所有元素的逗号分隔列表。与 toString() 方法不同, join() 方法接受名为 delimiter 的参数;可以使用此参数,选择要用作返回字符串中各个元素之间分隔符的符号。

下面的示例创建名为 rivers 的 Array,并调用 join() toString() 以便采用字符串形式返回该 Array 中的值。 toString() 方法用于返回以逗号分隔的值 ( riverCSV );而 join() 方法用于返回以 + 字符分隔的值。

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; 
var riverCSV:String = rivers.toString(); 
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi 
var riverPSV:String = rivers.join("+"); 
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi

对于 join() 方法,应注意的一个问题是,无论为主数组元素指定的分隔符是什么,为嵌套 Array 或 Vector 实例返回的值始终以逗号作为分隔符,如下面的示例所示:

var nested:Array = ["b","c","d"]; 
var letters:Array = ["a",nested,"e"];  
var joined:String = letters.join("+"); 
trace(joined); // output: a+b,c,d+e