array.filter to dynamically test 값
-
05-07-2019 - |
문제
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)" : ""));
}
}
}
문제는 배열 클래스 필터 방법입니다. 이런 식으로 작동합니다. 필터의 인수로 함수를 전달하고 전달한 함수에 따라 배열이 반환됩니다. 문제는 다른 매개 변수를 추가 할 수 없다는 것입니다. 따라서 동일한 배열에서 4 배열을 작성하고 동일한 기능을 사용하려면 이전에 테스트 할 값으로 설정 해야하는 클래스의 속성에 대해서만 테스트 할 수 있습니다. .
해당 매개 변수를 추가 할 수있는 다른 방법이 있습니까?
해결책
당신은 같은 것을 사용하고 싶습니다 대표 또는 함수 바인딩 또는 폐쇄. 코딩 및 용어 선호도에 따라 그들 모두의 아이디어는 코어 "필터"기능에 대한 동적 함수 래퍼를 생성한다는 것입니다. 이 래퍼는 귀하가 전달하는 추가 매개 변수에 액세스 할 수 있습니다. 그래서 처음으로 전화 할 때 갈 수 있습니다.
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);
}
);
여기서 FARMAT는 함수 정의에 의해 생성 된 클로저를 사용하여 통과합니다.
다른 팁
배열에서 가변 객체 속성에 의해 필터링되면 필터링을 다른 함수로 랩핑했습니다.
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);
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);
제휴하지 않습니다 StackOverflow