您的位置:首页 > 其它

Flex 数组(Array)属性使用及数组的遍历

2012-06-08 11:33 211 查看
[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

layout="vertical"

verticalAlign="middle"

backgroundColor="white"

initialize="onInit()">

<mx:Style>

.greenModal {

modalTransparencyColor: haloGreen;

}

.redModal {

modalTransparencyColor: red;

}

</mx:Style>

<mx:Script>

<!--[CDATA[

import mx.controls.Alert;

import mx.utils.StringUtil;

private var array:Array=[{label: "AAAAA", data: 5}, {label: "BBBBB", data: "liu"}, {label: "CCCCC", data: 3}, {label: "DDDDD", data: 2}, {label: "EEEEE", data: 1}];

private var newArray:Array=[{label: "桌子", data: 123.5}, {label: "电脑", data: 4741}];

private var arr0:Array=["AAAAA","DDDDD","YYYYY"];

private function onInit():void

{

var concatArray:Array=array.concat(newArray);

}

//Array.concat属性

private function concatArray(arr1:Array,arr2:Array):void

{

var arr:Array=arr1.concat(arr2);

dataGrid.dataProvider=arr;

}

//Array.join属性

private function joinArray():void

{

textArea.text=arr0.join(" ___/n");

dataGrid.dataProvider=arr0;

}

//Array.reverse

private function reverseArray():void

{

arr0.reverse();

dataGrid.dataProvider=arr0;

textArea.text=arr0.join("/n");

}

//Array.map

private function mapArray():void

{

var upperArray:Array=arr0.map(toUpper);

dataGrid.dataProvider=upperArray;

}

private function toUpper(element:*, index:int, arr:Array):String

{

return String(element).toLowerCase();

}

//for each

private function forEachArray():void

{

array.forEach(forEach);

dataGrid.dataProvider=array;

}

private function forEach(element:*,index:int,arr:Array):void

{

element.data=element.data+10;

}

//some,当有一个条件满足时就返回结果true,和every相对应,every是全部满足返回true

private function someArray():void

{

textArea.text="";

var success:Boolean=array.some(isNumeric);

dataGrid.dataProvider=array;

if(success)

{

Alert.show("Success.","Result",Alert.OK);

}

else

{

Alert.show("failed.","Result",Alert.OK);

}

}

//Array.every属性,与for each不同,for each会执行完第个元素,every则是当有一个不满足条件时就返回false结果

private function checkArray(arr:Array):void

{

textArea.text="";

dataGrid.dataProvider=arr;

//验证数组的全部元素属性是否满足条件

var success:Boolean=arr.every(isNumeric);

if (success)

{

Application.application.styleName="greenModal";

Alert.show("Array is numeric.", // text

"SUCCESS", // title

Alert.OK, // flags

null, // parent

null); // closeHandler

}

else

{

Application.application.styleName="redModal";

Alert.show("Array has non-numeric elements.", "ERROR", Alert.OK, null, null);

}

}

private function isNumeric(element:Object, index:int, arr:Array):Boolean

{

if((element.hasOwnProperty("data")) && (element.data is Number))

{

var str:String=StringUtil.substitute("{0} ({1})/n", element.label ,element.data);

textArea.text+=str;

return true;

}else return false;

}

]]-->

</mx:Script>

<mx:ApplicationControlBar dock="true">

<mx:Button label="Concat"

click="concatArray(array,newArray);"/>

<mx:Button label="Join"

click="joinArray();"/>

<mx:Button label="Reverse"

click="reverseArray();"/>

<mx:Button label="Map"

click="mapArray();"/>

<mx:Button label="ForEach"

click="forEachArray();"/>

<mx:Button label="Some"

click="someArray();"/>

<mx:Button label="Check Array 1"

click="checkArray(array);"/>

<mx:Button label="Check Array 2"

click="checkArray(newArray);"/>

</mx:ApplicationControlBar>

<mx:HBox>

<mx:DataGrid id="dataGrid"

rowCount="7">

<mx:columns>

<mx:DataGridColumn dataField="label"/>

<mx:DataGridColumn dataField="data"/>

</mx:columns>

</mx:DataGrid>

<mx:TextArea id="textArea"

editable="false"

width="{dataGrid.width}"

height="{dataGrid.height}"/>

</mx:HBox>

</mx:Application>

Filter :

[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

layout="vertical"

verticalAlign="middle"

backgroundColor="white"

creationComplete="init()">

<mx:Script>

<!--[CDATA[

private var keys:Object={};

/**

* Called by the Application container's creationComplete

* event handler. This method creates a new Array object

* which will be used as a data provider as well as a

* filtered view of that array which does not contain

* duplicated items.

*/

private function init():void

{

/* Create a dummy data source with some semi-random

data. */

var arr:Array=[];

arr.push({data: 1, label: "one"});

arr.push({data: 1, label: "one"});

arr.push({data: 1, label: "one"});

arr.push({data: 1, label: "one"});

arr.push({data: 2, label: "two"});

arr.push({data: 2, label: "two"});

arr.push({data: 2, label: "two"});

arr.push({data: 1, label: "one"});

arr.push({data: 3, label: "three"});

arr.push({data: 3, label: "three"});

/* Filter the original array and call the

removeDuplicates() function on each item

in the array. */

var filteredArr:Array=arr.filter(removedDuplicates);

arrColl.source=arr;

dedupedArrColl.source=filteredArr;

}

/**

* This method is used to filter an array so that no

* duplicate items are created. It works by first

* checking to see if a keys object already contains

* a key equal to the current value of the item.data

* value. If the key already exists, the current item

* will not be readded to the data provider. If the key

* does not already exist, add the key to the keys

* object and add this item to the data provider.

*/

private function removedDuplicates(item:Object, idx:uint, arr:Array):Boolean

{

if (keys.hasOwnProperty(item.label))

{

/* If the keys Object already has this property,

return false and discard this item. */

return false;

}

else

{

/* Else the keys Object does *NOT* already have

this key, so add this item to the new data

provider. */

keys[item.label]=item;

return true;

}

}

]]-->

</mx:Script>

<mx:ArrayCollection id="arrColl"/>

<mx:ArrayCollection id="dedupedArrColl"/>

<mx:HBox>

<mx:VBox>

<mx:Label text="Original ({arrColl.length} items):"/>

<mx:List dataProvider="{arrColl}"/>

</mx:VBox>

<mx:VBox>

<mx:Label text="Filtered ({dedupedArrColl.length} items):"/>

<mx:List dataProvider="{dedupedArrColl}"/>

</mx:VBox>

</mx:HBox>

</mx:Application>

搜索数组元素时,可以使用for语句配合break语句

[java] view
plaincopy

for(var i:int=0;i<array.length;i++)

{

if(array[i]==match)

{

trace("Element with index "+i+"found to match "+match);

break;

}

}

但上面这种方法效率不高,在ascb.util.ArrayUtilities类中,提供了findMatchIndex,findLastMatchIndex和findMatchIndices三种方法来搜索数组元素。

使用方法如下,ArrayUtilities.findMatchIndex(数组对象,需要匹配的值,搜索开始下标,布尔值);

其中搜索开始下标默认为0。布尔值表示是否返回部分匹配元素,默认为false,即不返回部分匹配元素。

findLastMatchIndex返回最后一个匹配的元素下标。findMatchIndice返回所有匹配的元素下标数组(注意:返回的结果是下标的数组)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: