7

配列を反復処理しながらどのように機能するかをテストしてspliceいましたが、リストに 0 が残っている理由がわかりません。

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
    } 
}

//0 % 2 == 0  is true, and yet
//array = [5, 9, 0, 1, 3, 7]
4

3 に答える 3

10

0はスキップされています

反復処理中に配列を変更 (変更) しています。これはプログラミングの禁止事項です。

通り抜けましょう...

i = 0 および 2 は偶数であり、スプライスされます。配列は [5, 9, 14, 0, 1, 3, 6, 7] になります。

i = 1 で、現在はインデックス 0 にある 5 もチェックしていませんでした...現在、奇数の 9 をチェックしています。

i = 2 および 14 は偶数であり、スプライスされます。配列は [5, 9, 0, 1, 3, 6, 7] になります。

i = 3 および 0 はスキップされます (現在、0 はインデックス 2 にあるため)、1 は奇数、問題ありません

i = 4 は奇数です

i = 5 は偶数で接合されます

i = 6 は奇数です

あなたが本当に欲しいのはこれです...

Array.prototype.filter = function(func) {
  var result = new Array();
  for (var i = 0; i < this.length; ++i) 
    if (func(this[i]))
      result.push(this[i]);
  return result;
}

values = [2, 5, 9, 14, 0, 1, 3, 6, 7];
odd_only = values.filter(function(x) { x % 2 != 0; });
于 2013-07-09T17:41:23.973 に答える
6

配列から値を削除するたびに、それに続く値をスキップします。これは、配列がスプライスごとに再インデックスされるためです。代わりに逆方向にループできます。

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = array.length-1; i >= 0; i--) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
    } 
}
于 2013-07-09T17:41:57.507 に答える
2

splice は配列のインデックスを再作成するため、0 をスキップします。これを使って:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
        i = i - 1;
    } 
}
于 2013-07-09T17:46:16.623 に答える