<!-- Google Adsense Begin <div style="margin: 3px; float: right;"> </div> Google Adsense End --><!--content with more link-->
和前面的Flex中如何通过filterFunction属性对XMLListCollection进行筛选的例子类似的,接下来的例子演示了Flex中如何利用Array.filter()事件,从一个数组中移除重复项目。
<?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.data)) { /* 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.data] = 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>