2012-06-25 56 views
0

在CoffeeScript中,我們可以做到這一點的方法:內聯重複鍵,在數組對象的值

rows = [ 
    {a: 1} 
    {b: 2} 
] 

for row in rows 
    for k,v of row 
     alert "#{k}: #{v}" 

那麼,爲什麼我們不能做這樣?:

for k,v of row for row in rows 
    alert "#{k}: #{v}" 

回答

4

你不能這樣做的,但你可以顛倒內循環,把表達式後的循環結構:

for row in rows 
    alert "#{k}: #{v}" for k,v of row 

而且,作爲內環也是一種表達,也可以反轉外環以同樣的方式:d

alert "#{k}: #{v}" for k,v of row for row in rows 

最相似的你想寫什麼大概是這樣的:

for row in rows then for k,v of row 
    alert "#{k}: #{v}" 

其可以使用另一個then進一步內聯(所述then關鍵字通常是等效於一個新行和添加縮進的一個電平):

for row in rows then for k,v of row then alert "#{k}: #{v}" 

所有這些替代的產生相同的JS代碼,所以挑選的一個或另一個不會導致性能下降或類似的情況:D

0

因爲該化合物語法不是Coffeescript語言的一部分。編程語言不像人類語言那麼流暢。

+0

問題不是關於「流體作爲人類語言」。 Python lambda允許我們在行內寫入更復雜的表達式。也許上面的迭代可以用CS編寫,但我不知道如何。 – mjey

0

當您嘗試運行for k,v of row for row in rows時,您會收到第1行的分析錯誤:意外的'FOR'

那是因爲你把東西for row in rows前的那一刻,它必須是一個表達for k,v of row是一個也沒有。你可以通過使前綴循環成爲實際表達式來驗證這一點:

row for k,v of row for row in rows 

這個編譯。因此,您所使用的後綴形式用於遍歷rows以同樣的方式,你必須與postfix內一個:

alert "#{k}: #{v}" for k,v of row for row in rows 

達到你想要的分離,你需要使用then來代替,而不是使用換行符後綴表達式:

​​
相關問題