Question

il s'agit d'un document 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)" : ""));
        }
    }
}

Le problème est la méthode de filtrage de la classe Array. Cela fonctionne comme ceci: vous passez une fonction en tant qu'argument de filtre et un tableau est renvoyé en fonction de la fonction que vous passez. Le problème est qu'il semble que vous ne pouvez ajouter aucun autre paramètre. Ainsi, si vous devez créer (par exemple dans une boucle for) 4 tableaux du même tableau et que vous souhaitez utiliser la même fonction, vous pouvez uniquement tester une propriété de la classe que vous devez préalablement définir sur la valeur que vous souhaitez tester. .

Existe-t-il un autre moyen d'ajouter ce paramètre?

Était-ce utile?

La solution

Vous souhaitez utiliser quelque chose comme Délégués ou la liaison de fonction, ou des fermetures. En fonction de vos préférences de codage et de terminologie. L’idée sous-jacente à toutes ces solutions est de créer un wrapper de fonction dynamique pour le "filtre" fondamental. une fonction. Ce wrapper aura accès aux paramètres supplémentaires que vous transmettez. Alors, la première fois que vous l'appelez, vous pourriez aller:

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

et la prochaine fois:

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

et votre fonction aurait quelque chose comme ceci:

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

Une méthode rapide et sale consiste à simplement passer une fonction en ligne comme celle-ci:

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

où param1 est passé à l'aide de la fermeture créée par la définition de fonction.

Autres conseils

Lors du filtrage par les propriétés d'un objet variable dans un tableau, j'ai intégré le filtrage dans une autre fonction:

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

Vous pouvez utiliser le deuxième paramètre de la méthode filter () pour transmettre des données à la fonction de filtrage. Il sera disponible comme " this " variable. Pour faire ce premier paramètre doit être une fermeture, pas une méthode de 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top