CoffeeScript for循环获取迭代器var

时间:2012-11-14 22:06:48

标签: coffeescript

在coffescript中我有

arr = ["a","b","c"]
for i in [0..arr.length] by 1
  if (sometimesTrue)
    arr.pop()
    i--

但它正在将其翻译成:

var arr, i, _i, _ref;

arr = ["a", "b", "c"];

for (i = _i = 0, _ref = arr.length; _i <= _ref; i = _i += 1) {
  if (sometimesTrue) {
    arr.pop();
    i--;
  }
}

您可以看到此循环使用_i作为参考而不是i,因此我的i--并没有真正做任何事情。

因为在这个循环中,数组的长度发生了变化,我需要弄清楚如何处理这个...有没有办法用for循环来做这个?或者我需要切换一段时间吗?

4 个答案:

答案 0 :(得分:2)

CoffeeScript会计算一次循环边界而你无法重置计算,所以当你迭代它时更改数组只会造成很大的混乱。

例如,这个:

f(i) for i in [0..a.length]

成为这个:

var i, _i, _ref;
for (i = _i = 0, _ref = a.length; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
  f(i);
}

请注意,在循环开始时计算_ref时,迭代次数是固定的。另请注意,i将在每次迭代时分配一个新值,因此您在循环内对i所做的任何更改都将被忽略。并且,请注意,循环[0..a.length]会进行a.length+1次迭代,而不是a.length次迭代; [a..b]生成一个封闭的间隔(即包含两个端点),[a...b]为您提供半开间隔(即不包括b)。同样,这个:

f(i) for i in a

成为这个:

var i, _i, _len;
for (_i = 0, _len = a.length; _i < _len; _i++) {
  i = a[_i];
  f(i);
}

同样,迭代次数是固定的,对i的更改也会被覆盖。

如果你想弄乱循环中的数组和循环索引,那么你必须使用while循环手动完成所有操作:

i = 0
while i < arr.length
  if(sometimesTrue)
    arr.pop()
    --i
  ++i

或:

i = 0
while i < arr.length
  if(sometimesTrue)
    arr.pop()
  else
    ++i

答案 1 :(得分:1)

修改你正在循环的数组很少会在for ... in ...构造的语言中实现你想要的。你真正想要的是filter。许多javascript实现都有一个附加到数组原型的过滤函数:

arr = arr.filter((member) -> !sometimesTrue)

如果你不能指望这一点,你可以使用类似的CoffeeScript结构:

arr = (member for member in arr when !sometimesTrue)

答案 2 :(得分:-1)

在coffeescript中使用索引是非常不自然的。

我认为你想要的是:

arr = ["a","b","c"]
arr = (i for i in arr when ! sometimeTrue )

我认为您应该阅读以下主题&#34;循环和理解&#34;在http://coffeescript.org/

答案 3 :(得分:-2)

有时候散步也许有所帮助,也许是在树林里真正清新的空气中,也许在房子前面带着一支小雪茄(虽然你的妻子可能讨厌吸烟)...... 有时甚至有助于与他们的显示器上的一些超级怪人谈论的橡皮鸭。 有时它简单明了有助于从不同的角度攻击简单的事物。 <击>     arr = [“a”,“b”,“c”]

for i in [0..arr.length]
  if (sometimesTrue)
    arr.splice i, 1
  else i++

<击>

编辑: 如下面的评论所示,我在这里遗漏了一些东西。 我确实完全没有被忽视,我怎么能首先想到这一点?