在Coffeescript中将while循环转换为for循环

时间:2012-06-01 14:32:08

标签: javascript coffeescript

这似乎是一个简单的转换,但我似乎无法找到它的语法。

i = start
while(if step > 0 then i < end else i > end)
  array.push i
  i += step

start,end和step是有符号整数

2 个答案:

答案 0 :(得分:2)

这可以做你想要的,假设你想要startend的数字作为array变量中的项目:

array = (i for i in [start...end])

答案 1 :(得分:1)

您应该阅读CofeeScript page on loops。但是在CoffeeScript中执行此操作的方法是使用list comprehension迭代范围:

(array.push i for i in [start...end] by step)

但请注意,列表推导会返回一个值。例如,给定此代码:

start = 10
end = 5
step = -2
array = []
(array.push i for i in [start...end] by step)

变量array如预期的那样以值[10,8,6]结束,但由于push返回刚刚推入的数组的新长度,返回值< / em>的最后一个语句 - 如果它是函数中的最后一个,将被返回,或者如果你在REPL中输入上面的内容,则会打印出来 - 等等,是[1, 2, 3]

编辑因此,如下所述,首先构建具有列表推导的数组会更好:

array = (i for i in [start...end] by step)

构建范围时,请注意...根据正确的端点产生排他范围,而..产生包含范围。因此[1..5]在列表中包含5个,而[1...5]在4处停止。

另外,如果你真的发现自己需要C风格的for循环的灵活性,你总是可以通过将它包装在反引号(`...`)中来在CoffeeScript中嵌入一些文字JavaScript:

`for (i=start; (step > 0 && i < end) || (step < 0 && i > end); i+=step) {
     array.push(i);
 }`