Подтвердить что ты не робот

Фильтр с пониманием списка CoffeeScript

В документах CoffeeScript указано, что методы списка должны иметь возможность выполнять операции select/filter:

Они должны уметь обрабатывать большинство где вы в противном случае использовали бы петля, каждый /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?

4b9b3361

Ответ 1

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

изменить: добавлено result =

Ответ 2

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

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

Существует аналогичный вопрос здесь