循环get迭代器var的CoffeeScript

循环get迭代器var的CoffeeScript,coffeescript,Coffeescript,在咖啡脚本中,我有 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 = ["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--;
  }
}
var arr,i,_i,_ref;
arr=[“a”、“b”、“c”];

对于(i=_i=0,_ref=arr.length;_i有时散步会有帮助,也许在树林里呼吸新鲜空气,也许在屋前抽支雪茄烟(尽管你妻子可能讨厌吸烟)。。。 有时,与一些优步极客显示器上的橡皮鸭交谈甚至会有所帮助。 有时候,从不同的角度来看待简单的事情,会有帮助。 arr=[“a”、“b”、“c”]

编辑: 从下面的评论中可以看出,我遗漏了一些东西。
我确实一点也没有被忽略,我怎么可能一开始就想到这一点呢?

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);
}
var i, _i, _len;
for (_i = 0, _len = a.length; _i < _len; _i++) {
  i = a[_i];
  f(i);
}
变成这样:

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

i=0
而我
在coffeescript中使用索引是非常不自然的

我认为你想要的是:

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

我认为您应该阅读以下主题“循环和理解”在

修改循环的数组时,很少会在语言中使用
为…在…结构实现所需的功能。您真正需要的是一个
过滤器
。许多javascript实现都在数组原型上附加了一个过滤器功能:

arr = arr.filter((member) -> !sometimesTrue)
如果您不能指望这一点,可以使用类似的CoffeeScript结构:

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

sometimesTrue
实际上是什么样子?在迭代数组时修改数组通常是个坏主意(即使您考虑了更改),在过滤时生成副本往往不太容易出错。你确定要更改
i
而不是
\u ref
?这是我正在编写的算法的一部分-是的,我可以这样做,但我想在coffeescript中访问循环中使用的迭代器可能会有问题。我想你无法读取循环ccounter(
表示e,i在ary中
),但您不能更改它。ahmm…我只是认为您可能需要拼接,而不是pop。您是否看到了此输出的javascript?(js2coffe.org)不漂亮。嗯,我看不出你的观点。这里的问题不是漂亮,而是功能性。此外,我不认为js在任何方面都那么难看,但是我经常使用coffeescript并习惯于它的编译内容。仅供参考:coffeescript.org在“try coffeescript”下也有一个实时编译器:)为了更清楚地说明这一点:我认为这个问题是:“我想在for循环中操作的数组中使用I-因此我不会随着循环的增加而增加,因为引入了I,我不能正确地使用它”。。。因此,else i++只是为了确保您对@K2xL翻译的美丽感到满意。。。我建议大家实际上可以省去范围内的东西,只说arr中的I,因为coffee在初始化时引入了一个puffer变量,因此在act中,数组操作虽然有点危险,但无害。。。但是,我不能说这是我自动想到的,但只是经过再三考虑,但是
I
在循环中是只读的,所以在循环中更改
I
是没有意义的。请尝试编译它。数组理解语法没有达到预期效果。
arr = arr.filter((member) -> !sometimesTrue)
arr = (member for member in arr when !sometimesTrue)