我对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 === bar) _results.push(foo);
}
return _results;
});
这是完美的。
但是,我有一个案例涉及多个条件,据我所知,上面的结构不支持它们。这一个:
->
for foo in foos
if foo is bar
foo
else if foo isnt bar
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);
} else if (foo !== bar) {
_results.push(bar);
} else {
_results.push(void 0);
}
}
return _results;
});
这没关系,但我想知道是否有办法摆脱额外的else
声明。现在我补充道:
else
return undefined
阻止推送到_results
并且有效。
那么,coffeescript中的构造是否与第一个示例类似,但是对于多个条件?
答案 0 :(得分:2)
if...else
解决方案对我来说非常好。请记住,when
用于实际跳过值。例如,
num for num in [1, 2, 3, 4] when num % 2 is 0
会给你
[2, 4]
相比之下,如果您希望循环返回与输入长度相同的列表,则应使用条件内部if...else
或switch
。
答案 1 :(得分:0)
我想知道你是否可以像这样玩:
-> select foo for foo in foos when foo matches bar
它需要一个函数来处理select
和matches
,但它会为您提供所需的语法:
(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;
});
答案 2 :(得分:0)
考虑到你的片段,我会使用:
foo for foo in foos when foo is bar or foo isnt bar
但他们可能过于简单了