Array.filter动态测试值

时间:2009-09-11 06:03:35

标签: actionscript-3 arrays filter testing

this is from Adobe docs

package {
    import flash.display.Sprite;
    public class Array_filter extends Sprite {
        public function Array_filter() {
            var employees:Array = new Array();
            employees.push({name:"Employee 1", manager:false});
            employees.push({name:"Employee 2", manager:true});
            employees.push({name:"Employee 3", manager:false});
            trace("Employees:");
            employees.forEach(traceEmployee);

            var managers:Array = employees.filter(isManager);
            trace("Managers:");
            managers.forEach(traceEmployee);
        }
        private function isManager(element:*, index:int, arr:Array):Boolean {
            return (element.manager == true);
        }
        private function traceEmployee(element:*, index:int, arr:Array):void {
            trace("\t" + element.name + ((element.manager) ? " (manager)" : ""));
        }
    }
}

问题是Array类过滤器方法。它以这种方式工作:您将函数作为过滤器的参数传递,并根据您传递的函数返回一个数组。问题是,似乎你无法添加任何其他参数。因此,如果您必须在同一个数组中创建(例如在for循环中)4个数组,并且您希望使用相同的函数,则只能针对您之前必须设置为要测试的值的类的属性进行测试。

还有其他方法可以添加该参数吗?

3 个答案:

答案 0 :(得分:3)

当通过数组中的变量对象属性进行过滤时,我将过滤包装到另一个函数中:

protected function FilterByProperty(input_array:Array, extra_testing:Object):Array
{
    function FilterFunction(element:Object, index:int, array:Array):Boolean
    {
        return element.property == extra_testing; // Arbitrary test
    }

    return input_array.filter(FilterFunction);
}

var filtered_array:Array = FilterByProperty(unfiltered_array, test_property);

答案 1 :(得分:2)

您可以使用filter()方法的第二个参数将数据传递给过滤器函数。它可以作为“这个”变量使用。要做到这一点,第一个参数必须是闭包,而不是类方法。

var array:Array = [...];
var params:Object = {"param1": value1, "param2": value2};

var filterFunction:Function = function(item:*, index:int, array:Array):Boolean {
    var param1 = this["param1"];
    var param2 = this["param2"];
};

array.filter(filterFunction, params);

答案 2 :(得分:0)

您希望使用类似Delegates或函数绑定或闭包的内容。取决于您的编码和术语首选项。所有这些背后的想法是你为核心“过滤器”功能创建一个动态函数包装器。该包装器可以访问您传递的额外参数。所以,你第一次打电话时,你可能会去:

a.filter(Delegate.create(myFunc, param1));

下一次:

a.filter(Delegate.create(myFunc, param2));

你的功能将是这样的:

private function myFunc(item:*, index:Number, a:Array, param:Object=null):Boolean{}

快速的脏方法就是传递这样的内联函数:

a.filter(
  function(item:*, index:Number, a:Array):Boolean { 
    return myFunc(item,index,a,param1); 
  }
); 

其中param1使用函数定义创建的闭包传递。