Coffeescript for循环中的多个条件
我有一个关于coffeescript for loop的问题 单条件情况通过以下方式实现:Coffeescript for循环中的多个条件,coffeescript,Coffeescript,我有一个关于coffeescript for loop的问题 单条件情况通过以下方式实现: -> foo for foo in foos when foo is bar 它产生: (function() { var foo, _i, _len, _results; _results = []; for (_i = 0, _len = foos.length; _i < _len; _i++) { foo = foos[_i]; if (foo === b
-> foo for foo in foos when foo is bar
它产生:
(function() {
var foo, _i, _len, _results;
_results = [];
for (_i = 0, _len = foos.length; _i < _len; _i++) {
foo = foos[_i];
if (foo === bar) _results.push(foo);
}
return _results;
});
并将其编译为:
(function() {
var foo, _i, _len, _results;
_results = [];
for (_i = 0, _len = foos.length; _i < _len; _i++) {
foo = foos[_i];
if (foo === bar) {
_results.push(foo);
} else if (foo !== bar) {
_results.push(bar);
} else {
_results.push(void 0);
}
}
return _results;
});
它可以防止推送到\u结果,并且可以正常工作
那么,coffeescript中是否有类似于第一个示例但适用于多种条件的构造?我想知道您是否可以这样使用它:
-> select foo for foo in foos when foo matches bar
它需要一个函数来处理选择
和匹配
,但它会提供您要查找的语法:
(function() {
var foo, _i, _len, _results;
_results = [];
for (_i = 0, _len = foos.length; _i < _len; _i++) {
foo = foos[_i];
if (foo(matches(bar))) _results.push(select(foo));
}
return _results;
});
(函数(){
变量foo,_i,_len,_results;
_结果=[];
对于(_i=0,_len=foos.length;_i<_len;_i++){
foo=foos[_i];
if(foo(匹配(条))_results.push(选择(foo));
}
返回结果;
});
如果……否则,解决方案在我看来非常好。请记住,when
用于实际跳过值。比如说,
num for num in [1, 2, 3, 4] when num % 2 is 0
我会给你
[2, 4]
相比之下,如果希望循环返回与输入长度相同的列表,则应在if…else
或开关中使用条件,因为我只会使用以下代码段:
foo for foo in foos when foo is bar or foo isnt bar
但它们可能过于简单化了我后来采用了if…else解决方案和手动重构javascript,因为在coffeescript中似乎没有满足我所寻找的构造(一种不将值返回到变量的方法,这在循环中的循环中是一个问题)。
[2, 4]
foo for foo in foos when foo is bar or foo isnt bar