Array的SortOn排序

sortOn () 方法   

AS3 function sortOn(fieldName:Object, options:Object = null):Array

语言版本 :  ActionScript 3.0 
RuntimeVersions:  AIR 1.0, Flash Player 9 



根据数组中的一个或多个字段对数组中的元素进行排序。数组应具有下列特性: 

该数组是索引数组,不是关联数组。
该数组的每个元素都包含一个具有一个或多个属性的对象。
所有这些对象都至少有一个公用属性,该属性的值可用于对该数组进行排序。这样的属性称为 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 选项只能用作数组中的第一个元素;否则,将忽略它们。


参数  fieldName:Object — 一个字符串,它标识要用作排序值的字段,或一个数组,其中的第一个元素表示主排序字段,第二个元素表示第二排序字段,依此类推。  
  
 options:Object (default = null) — 所定义常数的一个或多个数字或名称,相互之间由 bitwise OR (|) 运算符隔开,它们可以更改排序行为。options 参数可接受以下值: 
Array.CASEINSENSITIVE 或 1
Array.DESCENDING 或 2
Array.UNIQUESORT 或 4
Array.RETURNINDEXEDARRAY 或 8
Array.NUMERIC 或 16
 



返回 Array — 返回值取决于您是否传递任何参数: 
如果您为 options 参数指定值 4 或 Array.UNIQUESORT,并且要排序的两个或多个元素具有相同的排序字段,则返回值 0 并且不修改数组。 
如果为 options 参数指定值 8 或 Array.RETURNINDEXEDARRAY,则返回反映排序结果的数组并且不修改数组。
否则,不返回任何结果并修改该数组以反映排序顺序。
 

另请参见

| (bitwise OR)
Array.sort()

示例 


下面的代码创建一个空的 Array 对象 vegetables,然后通过五次调用如下方法来填充该数组:push()。每次调用 push() 时,都创建一个新的 Vegetable 对象(通过调用 Vegetable() 构造函数,该构造函数接受 String (name) 和 Number (price) 对象)。使用所显示的值调用 push() 五次,会生成下面的数组:[lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44]。然后,使用 sortOn() 方法(使用 name 参数)获得以下数组:[asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44]。然后,使用 price 参数及 NUMERIC 和 DESCENDING 常数再次调用 sortOn() 方法,以得到按数字降序排序的数组:[asparagus:3.99, spinach:1.89, lettuce:1.49, squash:1.44, celery:1.29]。 

var vegetables:Array = new Array();
vegetables.push(new Vegetable("lettuce", 1.49));
vegetables.push(new Vegetable("spinach", 1.89));
vegetables.push(new Vegetable("asparagus", 3.99));
vegetables.push(new Vegetable("celery", 1.29));
vegetables.push(new Vegetable("squash", 1.44));

trace(vegetables);
// lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44

vegetables.sortOn("name");
trace(vegetables);
// asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44

vegetables.sortOn("price", Array.NUMERIC | Array.DESCENDING);
trace(vegetables);
// asparagus:3.99, spinach:1.89, lettuce:1.49, squash:1.44, celery:1.29

class Vegetable {
    public var name:String;
    public var price:Number;

    public function Vegetable(name:String, price:Number) {
        this.name = name;
        this.price = price;
    }

    public function toString():String {
        return " " + name + ":" + price;
    }
}

下面的代码创建一个空的 Array 对象 records,然后通过三次调用如下方法来填充该数组:push()。每次调用 push() 时,将字符串 name 和 city 以及 zip 数字添加到 records。使用三个 for 循环输出数组元素。第一个 for 循环将按元素的添加顺序输出元素。第二个 for 循环在先按名称后按城市对 records 进行排序后运行,排序时使用 sortOn() 方法。第三个 for 循环生成不同的输出,因为 records 先按城市,再按名称重新排序。 


var records:Array = new Array();
records.push({name:"john", city:"omaha", zip:68144});
records.push({name:"john", city:"kansas city", zip:72345});
records.push({name:"bob", city:"omaha", zip:94010});

for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// john, omaha
// john, kansas city
// bob, omaha

trace("records.sortOn('name', 'city');");
records.sortOn(["name", "city"]);
for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// bob, omaha
// john, kansas city
// john, omaha

trace("records.sortOn('city', 'name');");
records.sortOn(["city", "name"]);
for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// john, kansas city
// bob, omaha
// john, omaha


下面的代码创建一个空的 Array 对象 users,然后通过四次调用如下方法来填充该数组:push()。每次调用 push() 时,都创建一个 User 对象(使用 User() 构造函数),同时将 name 字符串和 age uint 添加到用户。生成的数组集为 [Bob:3,barb:35,abcd:3,catchy:4]。 
然后按以下方式对数组进行排序: 

仅按姓名排序,得到数组 [Bob:3,abcd:3,barb:35,catchy:4]
按姓名排序并使用 CASEINSENSITIVE 常数,得到数组 [abcd:3,barb:35,Bob:3,catchy:4]
按姓名排序并使用 CASEINSENSITIVE 和 DESCENDING 常数,得到数组 [catchy:4,Bob:3,barb:35,abcd:3]
仅按年龄排序,得到数组 [abcd:3,Bob:3,barb:35,catchy:4]
按年龄排序并使用 NUMERIC 常数,得到数组 [Bob:3,abcd:3,catchy:4,barb:35]
按年龄排序并使用 DESCENDING 和 NUMERIC 常数,得到数组 [barb:35,catchy:4,Bob:3,abcd:3]

然后,创建一个名为 indices 的数组,并将按年龄排序并使用 NUMERIC 和 RETURNINDEXEDARRAY 常数的结果赋予该数组,从而得到数组 [Bob:3,abcd:3,catchy:4,barb:35],然后使用 for 循环输出该数组。


class User {
    public var name:String;
    public var age:Number;
    public function User(name:String, age:uint) {
        this.name = name;
        this.age = age;
    }

    public function toString():String {
        return this.name + ":" + this.age;
    }
}

var users:Array = new Array();
users.push(new User("Bob", 3));
users.push(new User("barb", 35));
users.push(new User("abcd", 3));
users.push(new User("catchy", 4));

trace(users); // Bob:3,barb:35,abcd:3,catchy:4

users.sortOn("name");
trace(users); // Bob:3,abcd:3,barb:35,catchy:4

users.sortOn("name", Array.CASEINSENSITIVE);
trace(users); // abcd:3,barb:35,Bob:3,catchy:4

users.sortOn("name", Array.CASEINSENSITIVE | Array.DESCENDING);
trace(users); // catchy:4,Bob:3,barb:35,abcd:3

users.sortOn("age");
trace(users); // abcd:3,Bob:3,barb:35,catchy:4

users.sortOn("age", Array.NUMERIC);
trace(users); // Bob:3,abcd:3,catchy:4,barb:35

users.sortOn("age", Array.DESCENDING | Array.NUMERIC);
trace(users); // barb:35,catchy:4,Bob:3,abcd:3

var indices:Array = users.sortOn("age", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
var index:uint;
for(var i:uint = 0; i < indices.length; i++) {
    index = indices[i];
    trace(users[index].name, ": " + users[index].age);
}

// Results:
// Bob : 3
// abcd : 3
// catchy : 4
// barb : 35
 

你可能感兴趣的:(Flash,AIR,actionscript)