对数组排序

可以使用三种方法(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 用作唯一的参数。排序函数接受两个参数 ab,因为它每次对两个数组元素进行操作。排序函数的返回值指示应如何对元素排序:

  • 返回值 -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() 方法定义两个参数 fieldNameoptions。必须将 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 
*/