我知道如何在咖啡脚本中进行递增的 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--)
我知道如何在咖啡脚本中进行递增的 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--)
编辑:从 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()
从咖啡脚本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);
}
只是为了记录而采取的不同做法:
i = something.length
while item = something[--i]
#use item
(将打破虚假值)
似乎没有一种优雅的反向循环方式。
我检查了有关此的 GitHub 票证,但已关闭:https ://github.com/jashkenas/coffee-script/issues/1187
以前的语法是:
for some in something by -1
但它已在最近的版本中被删除。编辑:它现在可以工作(对于 1.6.2 @time of edit)
惯用方式(来自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--
对于递减的、基于索引的 for 循环,您可以使用:
for i in [0...something.length].reverse()
这消除了@TrevorBurnham 提到的混乱,这是您自己指定端点的问题。
something.length
什么时候0
,这相当于
for i in []