web-dev-qa-db-fra.com

Filtrer avec Coffeescript Liste des compréhensions

Les Documents Coffescript indiquent que les compréhensions de la liste devraient pouvoir effectuer les opérations de sélection/filtre:

Ils devraient être capables de gérer la plupart des endroits où vous utiliseriez autrement une boucle, chacun/pourcheach, carte ou sélectionner/filtrer.

Vous imagineriez que vous pouviez faire quelque chose dans une ligne comme result = item for item in list if item % 2 == 0 Cependant, le plus proche que je puisse venir est

list = [1,2,3,4]
result = []
for item in list
  if item % 2 == 0 then result.Push item

Quelle est la manière la plus concise de filtrer une liste dans Coffeescript?

36
Derek Dahmer
result = (item for item in list when item % 2 == 0)

Edit: Ajout result =

78
Adrien

Sauf si vous essayez de serrer chaque once de la performance, je créerais une fonction de filtre comme celle-ci:

filter = (list, func) -> x for x in list when func(x)

ou si vous souhaitez l'ajouter au prototype de chaque tableau:

Array::filter = (func) -> x for x in @ when func(x)

puis écrire: (respectivement)

result = filter mylist, (x) -> x % 2 == 0

ou

result = mylist.filter (x) -> x % 2 == 0

Pour référence, c'est le JavaScript qui est généré:

var filter, result;
filter = function(list, func) {
    var x, _i, _len, _results;
    _results = [];
    for (_i = 0, _len = list.length; _i < _len; _i++) {
        x = list[_i];
        if (func(x)) {
            _results.Push(x);
        }
    }
    return _results;
};
Array.prototype.filter = function(func) {
    var x, _i, _len, _results;
    _results = [];
    for (_i = 0, _len = this.length; _i < _len; _i++) {
        x = this[_i];
        if (func(x)) {
            _results.Push(x);
        }
    }
    return _results;
};
result = filter(mylist, function(x) {
    return x % 2 === 0;
});
result = mylist.filter(function(x) {
    return x % 2 === 0;
});

Il y a une question similaire ici

8
Amir