【问题标题】: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--)

【问题讨论】:

    标签: loops for-loop coffeescript decrement


    【解决方案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
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 2019-02-23
        相关资源
        最近更新 更多