Фильтр со списками понимания CoffeeScript - PullRequest
34 голосов
/ 30 января 2011

Документы CoffeeScript утверждают, что списки должны иметь возможность выполнять операции выбора / фильтрации:

Они должны быть в состоянии справиться с большинством места, где в противном случае вы бы использовали цикл, каждый / forEach, карта или выберите / фильтр.

Вы бы представили, что можете сделать что-то в одну строку, как result = item for item in list if item % 2 == 0 Однако самое близкое, что я могу прийти, это

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

Какой самый краткий способ отфильтровать список в CoffeeScript?

Ответы [ 2 ]

77 голосов
/ 30 января 2011
result = (item for item in list when item % 2 == 0)

редактировать : добавлено result =

8 голосов
/ 30 января 2011

Если вы не пытаетесь выжать каждую унцию производительности, я бы создал функцию фильтра, например, такую:

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

или, если вы хотите добавить ее к прототипу каждого массива:

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

и затем напишите: (соответственно)

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

или

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

Для справки: генерируемый javascript:

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

Есть похожий вопрос здесь

...