【问题标题】:Simple CoffeeScript for loop from End to 0从 End 到 0 的简单 CoffeeScript for 循环
【发布时间】:2015-10-29 21:01:48
【问题描述】:

我正在使用 CoffeeScript,我需要从头到尾遍历一个数组才能删除元素。这似乎是一项微不足道的任务。这是我的原始代码,如果列表长度大于 0,则可以正常工作,但是当列表长度为 0 时,循环从 -1 运行到 0 包括在内。

list = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
length = list.length
for i in [length-1..0]
  if list[i] >= 3 and list[i] <= 5
    list.removeAt(i)

我为长度为 0 的数组隔离了问题:

length = 0
for i in [length-1..0]
  console.log '::', i

> :: -1
> :: 0

常规 JavaScript 中不会有问题:

length = 0
for (i = length - 1; i >= 0; i--){
  console.log('::', i)
}

// no output

我找不到任何方法在 CoffeeScript 中编写一个类似于上面 JavaScript 循环的 for 循环。

我找到了一个使用 while 循环的替代解决方案,但它并不漂亮。我想避免将我的 for 循环包装在 if 中。 有什么方法可以为此做一个 CoffeeScript 循环,就像上面的简单 JavaScript 循环一样?

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:

    假设您的最终目标是以相反的顺序遍历列表(这似乎是基于您的原始代码的情况),您可以在 CoffeeScript 中实现这一点

    list = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    for i in list by -1
      console.log i;
    

    编译成

    var i, j, list;
    
    list = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
    
    for (j = list.length - 1; j >= 0; j += -1) {
      i = list[j];
      console.log(i);
    }
    

    您可以play around with it 检查它是否也适用于空列表。


    如果您还需要循环体中的索引,请使用

    for e, i in list by -1
      console.log e  // array element
      console.log i  // array index
    

    【讨论】:

    • 但我认为他们需要循环索引和数组元素,所以我认为for e, i in list by -1 会更合适。
    • 很好的解决方案,我没有看到提到它的 1.5.0 发行说明。 您现在可以向后循环数组,而无需手动处理索引:for item in list by -1
    【解决方案2】:

    你说你需要从头到尾循环,所以你在 js 中的循环实际上是

    for (i = length - 1; i >= 0; i--){
      console.log('::', i)
    }
    

    在 CoffeeScript 中,可以这样实现:

    i = length - 1
    while i >= 0
      console.log '::', i
      i--
    

    【讨论】:

    • 感谢您在i-- 中指出我的错误,我在编写代码示例时出错。关于您的回答,我必须引用我的问题:我找到了一个使用 while 循环的替代解决方案,但它并不漂亮
    • 代码不应该是漂亮的;它应该可以工作。
    【解决方案3】:

    更多CoffeeScript解决方案:

    list = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    new_list = (i for i in list when i < 2 or i > 5)
    

    或只打印:

    console.log i for i in list when i < 2 or i > 5
    

    【讨论】:

    • 此解决方案确实有效,但它会创建一个包含匹配结果的新列表。因为我的列表绑定到我的 UI,所以在我的情况下它并不是很有效。
    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2014-01-15
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多