28

我知道如何在咖啡脚本中进行递增的 for 循环,例如:

咖啡脚本:

for some in something

生成的Javascript:

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

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

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

6 回答 6

51

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

首先,您应该熟悉by关键字,它可以让您指定一个步骤。其次,您必须了解 CoffeeScript 编译器对循环端点采取了一种非常幼稚的方法(参见问题 1187,Blender 链接到),这意味着

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

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

因此,您需要改用 range 循环语法,它可以让您自己指定这些端点——但也意味着您必须自己获取循环项:

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

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

for some in something.slice(0).reverse()
于 2011-10-27T19:06:20.413 回答
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);
}
于 2013-04-01T17:07:05.393 回答
2

只是为了记录而采取的不同做法:

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

(将打破虚假值)

于 2011-10-29T03:34:29.780 回答
1

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

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

以前的语法是:

for some in something by -1

但它已在最近的版本中被删除。编辑:它现在可以工作(对于 1.6.2 @time of edit)

于 2011-10-27T19:01:41.597 回答
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--
于 2011-10-27T19:01:01.713 回答
0

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

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

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

something.length什么时候0,这相当于

for i in []
于 2015-02-03T21:35:28.013 回答