Frage

dies ist von 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)" : ""));
        }
    }
}

Das problem ist die Array-Klasse-filter-Methode.Es funktioniert auf diese Weise:übergeben Sie eine Funktion als argument von filter und einem array zurückgegeben wird, basierend auf der Funktion, die Sie übergeben.Das problem ist, dass es scheint, Sie können nicht fügen Sie alle anderen parameter.Also, wenn Sie erstellen müssen (z.B. innerhalb einer for-Schleife) 4 arrays die array-und Sie möchten, verwenden Sie die gleiche Funktion, Sie können nur test gegen eine Eigenschaft der Klasse, die Sie müssen vorher gesetzt, um den Wert, den Sie testen möchten.

Gibt es eine andere Möglichkeit hinzufügen, die parameter?

War es hilfreich?

Lösung

Sie wollen, etwas zu verwenden wie Delegierte oder-Funktion-Bindung oder Verschlüsse.Je nach Codierung und Terminologie.Die Idee hinter allen von Ihnen ist, dass Sie erstellen Sie eine dynamische Funktion wrapper für den Kern der "filter" - Funktion.Die wrapper-haben Zugriff auf zusätzliche Parameter, die Sie übergeben.So, das erste mal, Sie nennen es, Sie könnte gehen:

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

und das nächste mal:

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

und Sie funktionieren würde etwas wie dieses:

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

Ein schnell ein dirty-Methode ist, übergeben Sie einfach eine inline-Funktion wie diese:

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

wo param1 übergeben wird mit der Schließung erstellt von der definition einer Funktion.

Andere Tipps

Wenn durch einen veränderlichen Objekteigenschaft in einer Anordnung Filterung, I die Filterung in einer anderen gewickelte Funktion:

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);

Sie können mit zweiten Parametern des Filters () Methode Daten Passfunktion zu filtern. Es wird als „diese“ variable avaliable sein. Um das zu tun erste Parameter muss ein Verschluss sein, keine Klassenmethode.

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top