减少咖啡脚本中的循环
Posted
技术标签:
【中文标题】减少咖啡脚本中的循环【英文标题】:Decrementing for loop in coffeescript 【发布时间】:2011-12-16 18:41:41 【问题描述】:我知道如何在 coffeescript 中进行递增的 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--)
【问题讨论】:
【参考方案1】:对于递减的、基于索引的 for 循环,您可以使用:
for i in [0...something.length].reverse()
这消除了@TrevorBurnham 提到的混乱,这是您自己指定端点的问题。
当something.length
是0
时,这相当于
for i in []
【讨论】:
【参考方案2】:编辑:从 CoffeeScript 1.5 开始支持 by -1
语法。
首先,您应该熟悉by
关键字,它可以让您指定一个步骤。其次,您必须了解 CoffeeScript 编译器对循环端点采取了一种非常幼稚的方法(请参阅 Blender 链接到的 issue 1187),这意味着
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
。 for i in [sth.length-1..0]
工作正常
@RicardoTomasi 您说得对,没有by -1
也可以工作,但效率较低——查看两者的编译输出。从编译器的角度来看,something.length
可能是负数,因此该步骤可能是1
或-1
。
@Robert 很好。 for i in [sth.length-1...-1]
“修复”:D
请注意,array[..]
是 array.slice(0)
的简写。
@davidchambers True,从 CoffeeScript 1.3.1 开始。【参考方案3】:
似乎没有一种优雅的反向循环方式。
我查看了有关此的 GitHub 票证,但已关闭:https://github.com/jashkenas/coffee-script/issues/1187
以前的语法是:
for some in something by -1
但它已在最近的版本中被删除。 编辑:它现在可以工作了(对于 1.6.2 @time of edit)
【讨论】:
【参考方案4】:从咖啡脚本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);
【讨论】:
您也可以使用element, index
语法,例如:console.log "#item.toString() at index #index" for item, index in list by -1
【参考方案5】:
另作记录:
i = something.length
while item = something[--i]
#use item
(会在虚假值上中断)
【讨论】:
这个在空数组上使用时不会中断【参考方案6】:惯用方式(来自docs)沿线:
lst = ['a', 'b', 'c']
for n in (num for num in [lst.length-1..0])
alert lst[n]
(在@Trevor 的注释后编辑)
编辑:
虽然,如果性能很关键,这个等效但可能不太美观的 sn-p 将生成更少的结果 javascript:
lst = [1,2,3]
i = lst.length
alert lst[i] while i--
【讨论】:
嗯,这仅在lst
是 [1,2,3]
时有效。如果你尝试,比如lst = ['a','b','c']
,输出仍然是3
、2
、1
。以上是关于减少咖啡脚本中的循环的主要内容,如果未能解决你的问题,请参考以下文章