0

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

4 に答える 4

2

CoffeeScript はループの境界を 1 回計算し、計算をリセットすることはできないため、繰り返し処理中に配列を変更すると、大きな混乱が生じるだけです。

たとえば、次のようになります。

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
于 2012-11-15T04:29:11.787 に答える
1

ループしている配列を変更しても、構造を持つ言語で必要なことはほとんどありませんfor ... in ...。あなたが本当に探しているのは、filter. 多くの JavaScript 実装には、配列プロトタイプに添付されたフィルター関数があります。

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

これが当てにならない場合は、同様の CoffeeScript 構成を使用できます。

arr = (member for member in arr when !sometimesTrue)
于 2012-11-17T17:47:52.637 に答える
-1

coffeescript でインデックスを使用するのは非常に不自然です。

あなたが望むのは次のようなものだと思います:

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

http://coffeescript.org/にある次のトピック「ループと内包表記」を読む必要があると思います。

于 2012-11-15T07:44:49.687 に答える
-2

森の中の真の新鮮な空気の中で、家の前でタバコを吸いながら散歩をすることが役立つ場合もあります (妻はタバコを吸うのを嫌うかもしれませんが) ... -オタクはモニターに持っています。また、単純なことを別の角度から攻撃するのに役立つ場合もあります。 arr = ["a", "b", "c"]

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

編集:以下のコメントに見られるように、ここで何かが欠けていました。私はまったく無視されていません。

于 2012-11-15T02:02:09.350 に答える