使用CoffeeScript列表推导进行过滤

Der*_*mer 35 list-comprehension coffeescript

CoffeeScript文档声明列表推导应该能够执行选择/过滤操作:

它们应该能够处理大多数你将使用循环,每个/ forEach,map或select/filter的地方.

你可以想象你可以在一条线上做点什么,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
Run Code Online (Sandbox Code Playgroud)

什么是最简洁的方法来过滤CoffeeScript中的列表?

Adr*_*ien 78

result = (item for item in list when item % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

编辑:添加result =

  • 把它放在一个函数中,否则它什么都不做.在http://jashkenas.github.com/coffee-script/中键入"Try Coffeescript"并查看javascript输出. (2认同)

Ami*_*mir 8

除非你试图挤出每一盎司的性能,否则我会创建一个这样的过滤函数:

filter = (list, func) -> x for x in list when func(x)
Run Code Online (Sandbox Code Playgroud)

或者如果要将其添加到每个数组的原型中:

Array::filter = (func) -> x for x in @ when func(x)
Run Code Online (Sandbox Code Playgroud)

然后写:(分别)

result = filter mylist, (x) -> x % 2 == 0
Run Code Online (Sandbox Code Playgroud)

要么

result = mylist.filter (x) -> x % 2 == 0
Run Code Online (Sandbox Code Playgroud)

作为参考,这是生成的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;
});
Run Code Online (Sandbox Code Playgroud)

还有一个类似的问题在这里