循环咖啡脚本?
问题描述:
我正在将一段代码从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网站上不清楚,有人可以给我一个清晰的解释吗?非常感谢你!
答
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
答
这里有一种方法(从这里开始: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
要小心,以这种方式使用'hasOwnProperty';如果碰巧有一个名为“hasOwnProperty”的邮件选项,它会失败。为了正确处理这种情况,在CoffeeScript中使用'Object.prototype.hasOwnProperty.call(mailOptions,k)'(或'Object :: hasOwnProperty.call mailOptions,k')。 – davidchambers 2013-02-10 07:33:28