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个数组,并且您希望使用相同的函数,则只能针对您之前必须设置为要测试的值的类的属性进行测试。
还有其他方法可以添加该参数吗?
答案 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使用函数定义创建的闭包传递。