AS3中Array数组的排序方法(sort 、sortOn )

作者:袖梨 2022-06-28

1,sort 方法

语法:function sort(... args):Array
对数组中的元素进行排序。Flash 根据 Unicode 值排序。(ASCII 是 Unicode 的一个子集。)

默认情况下,Array.sort() 按下面的列表中的说明进行排序:
排序区分大小写(Z 优先于 a)。
按升序排序(a 优先于 b)。
修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
数值字段按字符串方式进行排序,因此 100 优先于 99,因为 "1" 的字符串值比 "9" 的低。
如果您想通过使用不同于默认设置的设置来对数组进行排序,可以使用 options 参数的条目中描述的排序选项之一,或者,也可以创建自己的自定义函数来进行排序。如果您创建自定义函数,则可以通过调用 sort() 方法来使用它,将您的自定义函数的名称用作第一个参数 (compareFunction)。

参数:

... args-- 一个用来确定数组中元素排序顺序的比较函数。给定元素 A 和 B,compareFunction 的结果可具有以下三个值之一:
-1,如果 A 应在排序后的序列中出现在 B 之前
0,如果 A 等于 B
1,如果 A 应在排序后的序列中出现在 B 之后
options:Number [可选] - 所定义常数的一个或多个数字或名称,相互之间由 |(按位"或")运算符隔开,它们将排序的默认行为更改为其它行为。options 参数可接受以下值:

Array.CASEINSENSITIVE 或 1
Array.DESCENDING 或 2
Array.UNIQUESORT 或 4
Array.RETURNINDEXEDARRAY 或 8
Array.NUMERIC 或 16

有关此参数的更多信息,请参见 Array.sortOn() 方法。

注意: Array.sort() 是在 ECMA-262 中定义的,但 Flash Player 7 中引入的数组排序选项是对 ECMA-262 规范的特定于 Flash 的扩展。


示例1:

var vegetables:Array = new Array("spinach",

    "green pepper",

    "cilantro",

    "onion",

    "avocado");

trace(vegetables); // spinach,green pepper,cilantro,onion,avocado

vegetables.sort();

trace(vegetables); // avocado,cilantro,green pepper,onion,spinach

 

示例2:

var vegetables:Array = new Array("spinach",

    "green pepper",

    "Cilantro",

    "Onion",

    "Avocado");

vegetables.sort();

trace(vegetables); // Avocado,Cilantro,Onion,green pepper,spinach

vegetables.sort(Array.CASEINSENSITIVE);

trace(vegetables); // Avocado,Cilantro,green pepper,Onion,spinach

 

示例3:

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.sort();

trace(vegetables);

// asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44

 

class Vegetable {

    private var name:String;

    private var price:Number;

    public function Vegetable(name:String, price:Number) {

        this.name = name;

        this.price = price;

    }

    public function toString():String {

        return " " + name + ":" + price;

    }

}

 

示例4:

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.sort(sortOnPrice);

trace(vegetables);

// celery:1.29, squash:1.44, lettuce:1.49, spinach:1.89, asparagus:3.99

 

function sortOnPrice(a:Vegetable, b:Vegetable):Number {

    var aPrice:Number = a.getPrice();

    var bPrice:Number = b.getPrice();

    if(aPrice > bPrice) {

        return 1;

    } else if(aPrice < bPrice) {

        return -1;

    } else  {

        //aPrice == bPrice

        return 0;

    }

}

 

class Vegetable {

    private var name:String;

    private var price:Number;

    public function Vegetable(name:String, price:Number) {

        this.name = name;

        this.price = price;

    }

    public function getPrice():Number {

        return price;

    }

    public function toString():String {

        return " " + name + ":" + price;

    }

}

 

2,sortOn 方法

 

语法:function sortOn(fieldName:Object, options:Object = null):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 选项只能用作数组中的第一个元素;否则,将忽略它们。

参数:

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

如果您使用标志的字符串形式(例如,DESCENDING),而不是数字形式 (2),则启用代码提示
返回:数组

 

示例1:

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;

    }

}

示例2:

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


示例3:

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

相关文章

精彩推荐