문제

이것은 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)" : ""));
        }
    }
}

문제는 배열 클래스 필터 방법입니다. 이런 식으로 작동합니다. 필터의 인수로 함수를 전달하고 전달한 함수에 따라 배열이 반환됩니다. 문제는 다른 매개 변수를 추가 할 수 없다는 것입니다. 따라서 동일한 배열에서 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top