减少咖啡脚本中的循环

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.length0 时,这相当于

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()

【讨论】:

我认为你甚至不需要-1for 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'],输出仍然是321

以上是关于减少咖啡脚本中的循环的主要内容,如果未能解决你的问题,请参考以下文章

咖啡脚本中的 switch case 语句

迭代咖啡脚本中的方法名称[重复]

有没有办法在咖啡脚本中包含文件?

我的咖啡脚本中的条件语句在应该返回一个数字时返回一个布尔值[重复]

如何避免条件表达式中咖啡脚本中的隐式“返回”?

如何使用咖啡脚本遍历 JSON 哈希