CoffeeScript文档声明列表推导应该能够执行选择/过滤操作:
他们应该能够处理最多 否则你会使用的地方 循环,每个/ forEach,map或 选择/过滤
你可以想象你可以在一行中做点什么,比如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中过滤列表的最简洁方法是什么?
答案 0 :(得分:77)
result = (item for item in list when item % 2 == 0)
修改:已添加result =
答案 1 :(得分:8)
除非你试图挤出每一盎司的性能,否则我会创建一个这样的过滤函数:
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;
});
有一个类似的问题here