2012-01-13 122 views
0

我正在將一段代碼從JavaScript轉換爲coffeescript。循環咖啡腳本?

for (var i = 0, len = keys.length; i < len; i++) { 
    k = keys[i]; 
    if (!mailOptions.hasOwnProperty(k)) 
     mailOptions[k] = app.set('mailOptions')[k] 
    } 

我不知道如何接近它,並在doc網站上不清楚,有人可以給我一個清晰的解釋嗎?非常感謝你!

+0

要小心,以這種方式使用'hasOwnProperty';如果碰巧有一個名爲「hasOwnProperty」的郵件選項,它會失敗。爲了正確處理這種情況,在CoffeeScript中使用'Object.prototype.hasOwnProperty.call(mailOptions,k)'(或'Object :: hasOwnProperty.call mailOptions,k')。 – davidchambers 2013-02-10 07:33:28

回答

4
for key in keys 
    if not mailOptions.hasOwnProperty key 
    mailOptions[key] = (app.set 'mailOptions')[key] 

或保護式:

for key in keys when not mailOptions.hasOwnProperty key 
    mailOptions[key] = (app.set 'mailOptions')[key] 

編譯爲:

var key, _i, _len; 

for (_i = 0, _len = keys.length; _i < _len; _i++) { 
    key = keys[_i]; 
    if (!mailOptions.hasOwnProperty(key)) { 
    mailOptions[key] = (app.set('mailOptions'))[key]; 
    } 
} 
+1

護衛風格在這裏更可取(imo)。對於它的價值,'(app.set'mailOptions')[key]'通常會寫成app.set('mailOptions')[key]',儘管當然lispy風格是完全有效的。 – davidchambers 2013-02-10 07:36:50

1

這裏有一種方法(從這裏開始:http://js2coffee.org/):

i = 0 
len = keys.length 

while i < len 
    k = keys[i] 
    mailOptions[k] = app.set("mailOptions")[k] unless mailOptions.hasOwnProperty(k) 
    i++ 

但我不會做這種方式。我只想做:

for k in keys 
    mailOptions[k] = app.set("mailOptions")[k] unless mailOptions.hasOwnProperty k 

此輸出(不含var,它也輸出)以下:

for (_i = 0, _len = keys.length; _i < _len; _i++) { 
    k = keys[_i]; 
    if (!mailOptions.hasOwnProperty(k)) { 
    mailOptions[k] = app.set("mailOptions")[k]; 
    } 
} 

或者,如果你想成爲票友,我不要在此提醒情況,因爲它犧牲了一些可讀性:

(mailOptions[k] = app.set("mailOptions")[k] unless mailOptions.hasOwnProperty k) for k in keys