sortOn(Array.sortOn 方法)
public sortOn(fieldName:Object, [options:Object]) : Array
根据数组中的一个或多个字段对数组中的元素进行排序。数组应具有下列特性:
- 该数组是索引数组,不是关联数组。
- 该数组的每个元素都包含一个具有一个或多个属性的对象。
- 所有这些对象都至少有一个公用属性,该属性的值可用于对该数组进行排序。这样的属性称为 field。
如果您传递多个 fieldName
参数,则第一个字段表示主排序字段,第二个字段表示下一个排序字段,依此类推。Flash 根据 Unicode 值排序。(ASCII 是 Unicode 的一个子集。)如果所比较的两个元素中的任何一个不包含在 fieldName
参数中指定的字段,则认为该字段为 undefined
,并且在排序后的数组中不按任何特定顺序连续放置这些元素。
默认情况下,Array
.sortOn()
按以下方式进行排序:
- 排序区分大小写(Z 优先于 a)。
- 按升序排序(a 优先于 b)。
- 修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
- 数值字段按字符串方式进行排序,因此 100 优先于 99,因为 “1” 的字符串值比 “9” 的低。
Flash Player 7 添加了 options
参数,您可以使用该参数覆盖默认排序行为。若要对简单数组(例如,仅具有一个字段的数组)进行排序,或要指定一种 options
参数不支持的排序顺序,请使用Array.sort()
。
若要传递多个标志,请使用按位”或”(|
) 运算符分隔它们:
my_array.sortOn(someFieldName, Array.DESCENDING | Array.NUMERIC);
Flash Player 8 添加了按多个字段进行排序时为每个字段指定不同的排序选项的功能。在 Flash Player 8 中,options
参数接受一组排序选项,以便每个排序选项对应于 fieldName
参数中的一个排序字段。下面的示例使用降序排序对主排序字段 a
排序,使用数字排序对第二个排序字段 b
排序,使用不区分大小写的排序对第三个排序字段 c
排序:
Array.sortOn (["a", "b", "c"], [Array.DESCENDING, Array.NUMERIC, Array.CASEINSENSITIVE]);
注意:fieldName
和 options
数组必须具有相同数量的元素;否则,将忽略 options
数组。此外,Array.UNIQUESORT
和 Array.RETURNINDEXEDARRAY
选项只能用作数组中的第一个元素;否则,将忽略它们。
可用性:ActionScript 1.0;Flash Player 6
参数
fieldName:Object
– 一个标识要用作排序值的字段的字符串,或一个数组,其中的第一个元素表示主排序字段,第二个元素表示第二排序字段,依此类推。
options:Object
[可选] – 所定义常数的一个或多个数字或名称,相互之间由 bitwise OR (|)
运算符隔开,它们可以更改排序行为。options
参数可接受以下值:
Array.CASEINSENSITIVE
或 1 忽略大小写进行排序。Array.DESCENDING
或 2 按倒序排序。Array.UNIQUESORT
或 4 如果数组中有两个对象相同或具有相同的排序字段,则返回错误代码 (0),而不是排序后的数组。Array.RETURNINDEXEDARRAY
或 8Array.NUMERIC
或 16 如果进行比较的两个元素是数字,则按数字顺序排序。如果它们不是数字,则使用字符串比较(如果指定该标志,字符串比较可以不区分大小写)。
如果您使用标志的字符串形式(例如,DESCENDING
),而不是数字形式 (2),则启用代码提示。
返回
Array
– 返回值取决于是否传递任何参数:
- 如果您为
options
参数指定值 4 或Array.UNIQUESORT
,并且要排序的两个或多个元素具有相同的排序字段,则返回值 0 并且不修改数组。 - 如果为
options
参数指定值 8 或Array.RETURNINDEXEDARRAY
,则返回反映排序结果的数组并且不修改数组。 - 否则,不返回任何结果并修改该数组以反映排序顺序。
示例
下面的示例创建一个新数组,并且按照 name
字段和 city
字段对该新数组进行排序。第一次排序使用 name
作为第一个排序值,使用 city
作为第二个排序值。第二次排序使用 city
作为第一个排序值,使用 name
作为第二个排序值。
var rec_array:Array = new Array(); rec_array.push({name: "john", city: "omaha", zip: 68144}); rec_array.push({name: "john", city: "kansas city", zip: 72345}); rec_array.push({name: "bob", city: "omaha", zip: 94010}); for(i=0; i<rec_array.length; i++){ trace(rec_array[i].name + ", " + rec_array[i].city); } // Results: // john, omaha // john, kansas city // bob, omaha rec_array.sortOn(["name", "city"]); for(i=0; i<rec_array.length; i++){ trace(rec_array[i].name + ", " + rec_array[i].city); } // Results: // bob, omaha // john, kansas city // john, omaha rec_array.sortOn(["city", "name" ]); for(i=0; i<rec_array.length; i++){ trace(rec_array[i].name + ", " + rec_array[i].city); } // Results: // john, kansas city // bob, omaha // john, omaha
下面的对象数组由说明如何使用 options
参数的后续示例使用:
var my_array:Array = new Array(); my_array.push({password: "Bob", age:29}); my_array.push({password: "abcd", age:3}); my_array.push({password: "barb", age:35}); my_array.push({password: "catchy", age:4});
对 password 字段执行默认排序将产生以下结果:
my_array.sortOn("password"); // Bob // abcd // barb // catchy
对 password 字段执行不区分大小写的排序将产生以下结果:
my_array.sortOn("password", Array.CASEINSENSITIVE); // abcd // barb // Bob // catchy
对 password 字段执行不区分大小写的降序排序将产生以下结果:
my_array.sortOn("password", Array.CASEINSENSITIVE | Array.DESCENDING); // catchy // Bob // barb // abcd
对 age 字段执行默认排序将产生以下结果:
my_array.sortOn("age"); // 29 // 3 // 35 // 4
对 age 字段执行数值排序将产生以下结果:
my_array.sortOn("age", Array.NUMERIC); // my_array[0].age = 3 // my_array[1].age = 4 // my_array[2].age = 29 // my_array[3].age = 35
对 age 字段执行降序数值排序将产生以下结果:
my_array.sortOn("age", Array.DESCENDING | Array.NUMERIC); // my_array[0].age = 35 // my_array[1].age = 29 // my_array[2].age = 4 // my_array[3].age = 3
在使用 Array.RETURNEDINDEXARRAY
排序选项时,您必须将返回值分配给不同的数组。原始数组不会被修改。
var indexArray:Array = my_array.sortOn("age", Array.RETURNINDEXEDARRAY);