[AS3数组系列之四]数组排序问题
reverse()、sort() 和 sortOn()
reverse() 倒序排列
sort() 按照多种预定义的方式对数组进行排序,甚至可用来创建自定义排序算法。
sortOn() 方法可用来对对象的索引数组进行排序,这些对象具有一个或多个可用作排序键的公共属性。
sort() 方法按照"默认排序顺序"重新安排数组中的元素。默认排序顺序具有以下特征:
排序区分大小写,也就是说大写字符优先于小写字符。例如,字母 D 优先于字母 b。
排序按照升序进行,也就是说低位字符代码(例如 A)优先于高位字符代码(例如 B)。
排序将相同的值互邻放置,并且不区分顺序。
排序基于字符串,也就是说,在比较元素之前,先将其转换为字符串(例如,10 优先于 3,
因为相对于字符串 "3" 而言,字符串 "1" 具有低位字符代码)。
您也许需要不区分大小写或者按照降序对数组进行排序,或者您的数组中包含数字,
从而需要按照数字顺序而非字母顺序进行排序。
sort() 方法具有 options 参数,可通过该参数改变默认排序顺序的各个特征。
options 是由 Array 类中的一组静态常量定义的,如以下列表所示:
Array.CASEINSENSITIVE:此选项可使排序不区分大小写。例如,小写字母 b 优先于大写字母 D。
Array.DESCENDING:用于颠倒默认的升序排序。例如,字母 B 优先于字母 A。
Array.UNIQUESORT:如果发现两个相同的值,此选项将导致排序中止。
Array.NUMERIC:这会导致排序按照数字顺序进行,比方说 3 优先于 10。
如:
- var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
- poets.sort(); // CuPlayer.com提示:默认排序
- trace(poets); // 输出:Angelou,Blake,Dante,cummings
- poets.sort(Array.CASEINSENSITIVE);
- trace(poets); // 输出:Angelou,Blake,cummings,Dante
- poets.sort(Array.DESCENDING);
- trace(poets); // 输出:cummings,Dante,Blake,Angelou
- poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // 使用两个选项
- trace(poets); // 输出:Dante,cummings,Blake,Angelou
可以编写自定义排序函数,然后将其作为参数传递给 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); // 输出:John Q. Smith,Jane Doe,Mike Jones
- names.sort(orderLastName);
- trace(names); // 输出:Jane Doe,Mike Jones,John Q. Smith
说明下:
自定义函数作为参数传入sort。其自定义参数必须有2个参数组成。
因为它每次对两个数组元素进行操作。排序函数的返回值指示应如何对元素排序:
返回值 -1 表示第一个参数 a 优先于第二个参数 b。
返回值 1 表示第二个参数 b 优先于第一个参数 a。
返回值为 0 表示元素具有相同的排序优先级。
sortOn() 方法是为对象数组而使用。
对象元素中应具有一个可用作排序键的公共属性。
如以下数组中的元素是由对象组成。
以下对象中以姓和年份组成。
- 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 属性对数组进行排序。
sortOn() 带两个参数 fieldName 和 options。
如,使用两个参数 "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);
- }
- /* 输出:
- Wang 701
- Dante 1265
- Blake 1757
- cummings 1894
- Angelou 1928
- */
当在sort() 和 sortOn()中使用
Array.RETURNINDEXEDARRAY 常量作为 options 参数。
会对数组排序而又不修改现有数组。
如:
- var indices:Array;
- //CuPlayer.com提示说明
- //indices 为poets元素排序后的元素索引数组,
- 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);
- }
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例