|
|
对数组排序可以使用三种方法(reverse()、sort() 和 sortOn())通过排序或反向排序来更改索引数组的顺序。所有这些方法都用来修改现有数组。下表概述了这些方法及其针对 Array 和 Vector 对象的行为:
reverse() 方法reverse() 方法不带参数,也不返回值,但可以将数组从当前顺序切换为相反顺序。以下示例颠倒了 oceans 数组中列出的海洋顺序: var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; oceans.reverse(); trace(oceans); // output: Pacific,Indian,Atlantic,Arctic 使用 sort() 方法的基本排序(仅适用于 Array 类)对于 Array 实例,sort() 方法按照“默认排序顺序”重新排列数组中的元素。默认排序顺序具有以下特征:
您也许需要不区分大小写或者按照降序对 Array 进行排序,或者您的数组中包含数字,从而需要按照数字顺序而非字母顺序进行排序。Array 类的 sort() 方法具有 options 参数,可通过该参数改变默认排序顺序的各个特征。options 是由 Array 类中的一组静态常量定义的,如以下列表所示:
以下示例重点说明了这些选项中的某些选项。它创建一个名为 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,因为它每次对两个数组元素进行操作。排序函数的返回值指示应如何对元素排序:
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
*/
|