Jul 12
和前面的Flex中如何通过filterFunction属性对XMLListCollection进行筛选的例子类似的,接下来的例子演示了Flex中如何利用Array.filter()事件,从一个数组中移除重复项目。
让我们先来看一下Demo(可以右键View Source或点击这里察看源代码):
下面是完整代码(或点击这里察看):
Download: main.mxml
- <?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>
代码:Peter deHaan 翻译/整理/编译:minidxer
