从End到0循环的简单CoffeeScript

时间:2015-10-28 20:46:49

标签: javascript coffeescript

我正在使用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中的for循环,其行为类似于上面的JavaScript循环。

我找到了一个使用while循环的替代解决方案,但它并不漂亮。我想避免在if内包装我的for循环。 任何方式为此做一个CoffeeScript循环就像上面的简单JavaScript循环一样?

3 个答案:

答案 0 :(得分:4)

假设您的最终目标是以相反的顺序迭代列表(这似乎是基于原始代码的情况),您可以在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

答案 1 :(得分:0)

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

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

在CoffeeScript中,可以按如下方式实现:

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

答案 2 :(得分:0)

更多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