减少coffeescript中的循环

Joh*_*ohn 28 loops for-loop decrement coffeescript

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

CoffeeScript的:

for some in something
Run Code Online (Sandbox Code Playgroud)

生成的Javascript:

for (_i = 0, _len = something.length; _i < _len; _i++)
Run Code Online (Sandbox Code Playgroud)

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

for (var i = something.length-1; i >= 0; i--)
Run Code Online (Sandbox Code Playgroud)

Tre*_*ham 51

编辑:by -1支持CoffeeScript 1.5 语法.

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

for some in something by -1 # don't do this!!!
Run Code Online (Sandbox Code Playgroud)

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

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

for i in [something.length - 1..0] by -1
  some = something[i]
Run Code Online (Sandbox Code Playgroud)

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

for some in something.slice(0).reverse()
Run Code Online (Sandbox Code Playgroud)

  • @RicardoTomasi你是正确的,它将在没有`by -1`的情况下工作,但效率较低 - 看看两者的编译输出.从编译器的角度来看,`something.length`可能是负面的,因此该步骤可能是"1"或"-1". (4认同)

Eva*_*ran 38

从咖啡脚本1.5.0开始,支持:

for item in list by -1
  console.log item
Run Code Online (Sandbox Code Playgroud)

这将转化为

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

  • 你也可以使用`element,index`语法,如:`console.log"#{item.toString()}索引#{index}"表示项目,索引列表-1表示 (2认同)