2011-12-13 153 views
1

我有一個關於coffeescript for循環的問題。for循環中的多個條件

單條件的情況下通過以下步驟實現:

-> 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它的工作原理。

那麼,是否有一個類似於第一個例子但有多個條件的咖啡腳本?

回答

2

if...else解決方案對我來說看起來非常好。請記住,when實際上是跳過數值。例如,

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

會給你

[2, 4] 

相反,如果你希望循環與相同長度的輸入返回一個列表,你應該用一個條件內,無論是if...elseswitch

+0

我如果...其他的解決方案和JavaScript的手動重構之後因爲似乎沒有結構去在coffeescript滿足我正在尋找的東西(一種不返回值的變量這是一個問題,特別是在循環內循環)。 – Krule

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; 
}); 
0

鑑於你的片段我只想用:

foo for foo in foos when foo is bar or foo isnt bar 

但他們也許oversimplificated