我正在使用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循环一样?
答案 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