for循环中的多个条件

时间:2011-12-13 11:48:54

标签: 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 === 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中的构造是否与第一个示例类似,但是对于多个条件?

3 个答案:

答案 0 :(得分:2)

if...else解决方案对我来说非常好。请记住,when用于实际跳过值。例如,

num for num in [1, 2, 3, 4] when num % 2 is 0

会给你

[2, 4]

相比之下,如果您希望循环返回与输入长度相同的列表,则应使用条件内部if...elseswitch

答案 1 :(得分:0)

我想知道你是否可以像这样玩:

-> select foo for foo in foos when foo matches bar

它需要一个函数来处理selectmatches,但它会为您提供所需的语法:

(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

但他们可能过于简单了