Flex Array 的一些有用的操作
我想大家一定都很熟悉Array了吧?我们几乎每天都在和Array 打交道,但是你是否几乎没有注意到Array提供给我们的一些有用的方法呢?
1.Array 的增删改查
1)在数组最后增加一个元素
var employees:Array = new Array(); employees.push({name:"Employee 1", manager:false});
2)在数组最前面增加一个元素
var employees:Array = new Array(); employees.push({name:"Employee 1", manager:false,salary:100}); employees.unshift({name:"Employee 2", manager:true,salary:1000}); employees.unshift({name:"Employee 3", manager:false,salary:200});
3)删除数组最后一个元素
employees.pop();
4)删除数组第一个元素
employees.shift();
5)在第二和第三之前插入一个元素
employees.splice(1,0,{name:"Employee 4", manager:false})
6)删除第三个元素
employees.splice(2,1)
2.Array的排序
1).反转Array
employees.reverse();
2)Array.sort()
默认情况下,Array.sort() 按以下方式进行排序:
排序区分大小写(Z 优先于 a)。
按升序排序(a 优先于 b)。
修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
元素无论属于何种数据类型,都作为字符串进行排序,所以 100 在 99 之前,这是因为 "1" 的字符串值小于 "9" 的字符串值。
Array.NUMERIC 参数实际上没有将其他数据类型转换为 Number 数据类型,它只是允许排序算法识别数字。如果既有数字又有string,则会报错。
你可以用Array.sort(compareFunction, sortOptions) 改变排序行为。
protected function application1_creationCompleteHandler(event:FlexEvent):void { var employees:Array = new Array(); employees.push({name:"Employee 1", manager:false,salary:100}); employees.unshift({name:"Employee 2", manager:true,salary:1000}); employees.unshift({name:"Employee 3", manager:false,salary:200}); employees.sort(sortOnSalary); employees.forEach(traceEmployee); employees.sort(sortOnSalary,Array.DESCENDING); employees.forEach(traceEmployee); } private function sortOnSalary(a:Object, b:Object):Number { var aSalary:Number = Number(a.salary); var bSalary:Number = Number(b.salary); if(aSalary > bSalary) { return 1; } else if(aSalary < bSalary) { return -1; } else { //aPrice == bPrice return 0; } } private function traceEmployee(element:*, index:int, arr:Array):void { trace(element.name + " (" + element.manager + " " + element.salary + ")"); }
3.Array的过滤
filter 过滤函数对数组中的每一项执行测试函数,并构造一个新数组,其中的所有项都对指定的函数返回 true
。如果某项返回 false
,则新数组中将不包含此项。
employees = employees.filter(callback);
private function callback(item:*, index:int, array:Array):Boolean { if(item.name == "Employee 5") { return false; } return true; }
4.Array的建立
var myArr:Array = new Array("one", "two", "three"); 或者 var myArr:Array = new Array(3); 或者 var numbers:Array = new Array(1, 2, 3); var letters:Array = new Array("a", "b", "c"); var numbersAndLetters:Array = numbers.concat(letters); var lettersAndNumbers:Array = letters.concat(numbers);
5.Array的测试
every(callback:Function, thisObject:* = null):Boolean如果数组中的所有项对指定的函数都返回 true
,则为布尔值 true
;否则为 false
。
var arr1:Array = new Array(1, 2, 4); var res1:Boolean = arr1.every(isNumeric); trace("isNumeric:", res1); // true var arr2:Array = new Array(1, 2, "ham"); var res2:Boolean = arr2.every(isNumeric); trace("isNumeric:", res2); // false private function isNumeric(element:*, index:int, arr:Array):Boolean { return (element is Number); }
some(callback:Function, thisObject:* = null):如果数组中的任何一项对于指定的函数都返回 true
,则为布尔值 true
,否则为 false
。
var arr:Array = new Array(); arr[0] = "one"; arr[1] = "two"; arr[3] = "four"; var isUndef:Boolean = arr.some(isUndefined); if (isUndef) { trace("array contains undefined values: " + arr); } else { trace("array contains no undefined values."); } private function isUndefined(element:*, index:int, arr:Array):Boolean { return (element == undefined); }
6.Array对每一项的操作
function forEach(callback:Function, thisObject:* = null):void对数组中的每一项执行函数,仅仅是执行而已,不对数组进行修改.
employees.forEach(traceEmployee); private function traceEmployee(element:*, index:int, arr:Array):void { trace(element.name + " (" + element.manager + " " + element.salary + ")"); }
但是如果你在此函数中修改element的其他属性值,那么也会直接改变此数组相应的值.
private function traceEmployee(element:*, index:int, arr:Array):void { trace(element.name + " (" + element.manager + " " + element.salary + ")"); element.name = "kenny"; }
function map(callback:Function, thisObject:* = null):Array 对数组中的每一项执行函数并构造一个新数组,其中包含与原始数组中的每一项的函数结果相对应的项。
employees = employees.map(mapTestFunction);
private function mapTestFunction(element:*,index:int,arr:Array):String { return element.name + "kenny"; }
7.Array 的切片
function slice(startIndex:int = 0, endIndex:int = 16777215):Array 返回由原始数组中某一范围的元素构成的新数组,而不修改原始数组。返回的数组包括 startIndex
元素以及从其开始到 endIndex
元素(但不包括该元素)的所有元素。
var letters:Array = new Array("a", "b", "c", "d", "e", "f"); var someLetters:Array = letters.slice(1,3); trace(letters); // a,b,c,d,e,f trace(someLetters); // b,c
如果什么参数也没有传,那么就创建此数组的一个副本。
8.Array 与 String 相互转化
Array 转化为 String
function join(sep:*):String 将数组中的元素转换为字符串、在元素间插入指定的分隔符、连接这些元素然后返回结果字符串。嵌套数组总是以逗号 (,) 分隔,而不使用传递给 join()
方法的分隔符分隔。
var myArr:Array = new Array("one", "two", "three"); var myStr:String = myArr.join(" and "); trace(myArr); // one,two,three trace(myStr); // one and two and three
String 转化为 Array
function split(delimiter:*, limit:Number = 0x7fffffff):Array 将 String 对象拆分为一个子字符串数组,方法是在所有出现指定 delimiter
参数的位置进行拆分。limit 为放入数组中的最大项数。默认为允许的最大值。
var str:String = "abc"; var resultArray:Array = str.split();
相关推荐
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。