Flex Filterfunction - 按值数组过滤

时间:2011-03-17 15:35:39

标签: flex actionscript-3

如何通过“数组值”而不是单个值(简单比较)过滤Arraycollection,下面的代码片段用于按单值过滤我现在进入的场景就像过滤掉了价格[10,4,1] ,8](主集合中的一些随机值)。 有没有更好的方法来执行第二个代码段

过滤功能简单比较

            private function filterForTestData(item:Object):Boolean{
                   if(item.price < slider.value) return true;
                   else return false;      
            }

按值数组过滤

            private function filterForTestData(item:Object,filterBy:Array= [10,4,1,8]):Boolean{
                 for(randomprice in filterBy)
                 return item.price == randomprice;
}
[Edited]

应用过滤器

testData.filterFunction = filterForTestData;

[编辑]

我没有提到的一点是filterBy数组中的项是自定义数据而不是基本数据类型。

2 个答案:

答案 0 :(得分:1)

为什么不使用Array中的indexof方法?

private function filterForTestData(item:Object,filterBy:Array= [10,4,1,8]):Boolean{
    return filterBy.indexof(item.price) != -1;
}

(这会检查是否在filterBy数组中找到了项目的价格值。如果不是,则indexof方法返回-1。否则,它将返回数组的索引。)

我没有对此进行过测试 - 您可能需要将item.price转换为Number类型,但我不确定。

答案 1 :(得分:1)

我打算回答这个问题,使用一个对象作为查找然后使用hasOwnProperty来确定是否在过滤器对象上设置了属性。从实际测试我的方法以及这两个方法(创建一个带有数字字符串的模拟数据集(其中100,000个),并且运行时方法之间的方差可忽略不计(范围介于130和160ms之间)。我认为基本上所有这三个都有相同的运行时间。

这是我的完整代码所以你可以乱搞并指出我是否做了一些使我的测试无效的东西,但这对我来说似乎有意义,使用indexOf它需要迭代整个集合直到它找到对象(假设一个纯粹的线性集合而不是树)与hasOwnProperty相同(需要获取所有属性的列表并迭代它们,除非有内置的机制来更有效地找到属性:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="vertical"
                height="100%"
                width="100%"
                xmlns:code="http://code.google.com/p/flex-iframe/"
                creationComplete="application1_creationCompleteHandler(event)">

    <mx:Script>
        <![CDATA[
            import flash.utils.getTimer;

            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;

             /* private function filterForTestData(item:Object):Boolean{
                return filterBy.hasOwnProperty(item);
            }  */
            /* private function filterForTestData(item:Object):Boolean{
                return filterBy.indexOf(item) != -1;
            } */
            private function filterForTestData(item:Object):Boolean{
                for(var randomprice in filterBy)
                    return item == randomprice;
                return false;
            }

            [Bindable]
            private var dp:ArrayCollection = new ArrayCollection(['1','2','3','4','5','6','7','8']);
            private var filterBy:Object={'10':true,'4':true,'1':true,'8':true};
            //private var filterBy:Array= ['10','4','1','8'];
            protected function button2_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub
                var startTime:int = getTimer();
                trace(getTimer());
                dp.filterFunction = filterForTestData;
                dp.refresh();
                var endTime:int = getTimer();
                trace("total time: " + (endTime-startTime).toString());
            }


            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub
                for(var i:int=0;i<100000;i++)
                {
                    dp.addItem(Math.floor(Math.random()*100).toString());
                }
                theList.dataProvider = dp;
            }

        ]]>
    </mx:Script>
    <mx:List id="theList" width="100"/>
    <mx:Button click="button2_clickHandler(event)"/>
</mx:Application>

我将尝试从纯粹的数据角度考虑这一点,看看是否有可能获得比这更好的运行时间,或者只是问题的本质需要进行一定数量的检查(渐近分析) )。

好问题。

[编辑] 好吧,经过深思熟虑后,我相信不使用更复杂的数据结构(并且在创建/重新组织数据结构时预先花费处理器时间成本...考虑保持平衡的搜索树)我很确定任何方法将导致与这些方法相同或更差的运行时间(即线性运行时间或更差的O(n))。使用树结构,您将获得用于搜索的O(log n)的运行时间,但是在保持树平衡(根据需要进行旋转)时会产生更多的处理开销。如果有人可以使这个陈述失效,我会很高兴,如果你这样做,但我相信这一切都是真的。

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/binarySearchTree.htm