减少coffeescript中的循环

时间:2011-10-27 18:55:47

标签: loops for-loop coffeescript decrement

我知道如何在coffeescript中进行循环递增,例如:

CoffeeScript的:

for some in something

生成的Javascript:

for (_i = 0, _len = something.length; _i < _len; _i++)

如何在Coffeescript中创建类似于此的循环递减?

for (var i = something.length-1; i >= 0; i--)

6 个答案:

答案 0 :(得分:52)

编辑:从CoffeeScript 1.5开始支持by -1语法。

首先,您应该熟悉by关键字,它允许您指定步骤。其次,您必须了解CoffeeScript编译器对循环端点采用了一种非常天真的方法(参见issue 1187,Blender链接到的),这意味着

for some in something by -1 # don't do this!!!

将导致无限循环 - 它从索引0开始,将索引递增-1,然后等待直到索引命中something.length。叹息。

因此,您需要使用范围循环语法,这样您可以自己指定这些端点 - 但也意味着您必须自己获取循环项:

for i in [something.length - 1..0] by -1
  some = something[i]

显然这很混乱。因此,您应该强烈考虑迭代something.reverse()。请记住reverse()修改您调用它的数组!如果你想保留一个数组但是向后迭代它,你应该复制它:

for some in something.slice(0).reverse()

答案 1 :(得分:38)

从咖啡脚本1.5.0开始支持:

for item in list by -1
  console.log item

这将转化为

var item, _i;
for (_i = list.length - 1; _i >= 0; _i += -1) {
  item = list[_i];
  console.log(item);
}

答案 2 :(得分:2)

仅供记录使用的另一种方法:

i = something.length
while item = something[--i]
  #use item

(会打破假值)

答案 3 :(得分:1)

似乎没有一种优雅的反向循环方式。

我检查了GitHub票证,但已关闭:https://github.com/jashkenas/coffee-script/issues/1187

过去的语法是:

for some in something by -1

但它已在最近的版本中被删除。 编辑:它现在有效(编辑时为1.6.2)

答案 4 :(得分:0)

惯用法(来自docs)沿着以下方式:

lst = ['a', 'b', 'c']
for n in (num for num in [lst.length-1..0])
  alert lst[n]

(在@ Trevor的注释后编辑)

修改

虽然,如果性能至关重要,这个等效但可能不太美观的代码片段会产生较少的javascript:

lst = [1,2,3]
i = lst.length
alert lst[i] while i--

答案 5 :(得分:0)

对于递减的,基于索引的for循环,您可以使用:

for i in [0...something.length].reverse()

这消除了@TrevorBurnham提到的混乱,这是一个自己指定端点的问题。

something.length0时,这相当于

for i in []