我知道如何在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--)
答案 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.length
为0
时,这相当于
for i in []