Domanda

proviene da documenti Adobe :

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

Il problema è il metodo di filtro della classe Array. Funziona in questo modo: si passa una funzione come argomento di filtro e un array viene restituito in base alla funzione che si passa. Il problema è che sembra che non puoi aggiungere nessun altro parametro. Pertanto, se è necessario creare (ad esempio all'interno di un ciclo for) 4 array dallo stesso array e si desidera utilizzare la stessa funzione, è possibile eseguire il test solo su una proprietà della classe che è stata precedentemente impostata sul valore che si desidera verificare .

Esiste un altro modo per aggiungere quel parametro?

È stato utile?

Soluzione

Vuoi usare qualcosa come Delegati o associazione di funzioni o chiusure. A seconda delle preferenze di codifica e terminologia. L'idea alla base di tutti loro è quella di creare un wrapper di funzioni dinamiche per il core "filtro". funzione. Quel wrapper avrà accesso a parametri extra che passi. Quindi, la prima volta che lo chiami, potresti andare:

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

e la prossima volta:

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

e la tua funzione avrebbe qualcosa del genere:

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

Un metodo rapido e sporco è semplicemente passare una funzione inline come questa:

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

dove param1 viene passato usando la chiusura creata dalla definizione della funzione.

Altri suggerimenti

Durante il filtraggio per proprietà di un oggetto variabile in un array, ho inserito il filtro in un'altra funzione:

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

È possibile utilizzare il secondo parametro del metodo filter () per passare i dati alla funzione filtro. Sarà disponibile come " questo " variabile. Per fare questo primo parametro deve essere una chiusura, non un metodo di classe.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top