var myArray = [1,2,3,4,5,6,7,8,9];
function isOdd(value){
return value % 2;
}
for(var i = 0; i < myArray.length; i++){
if(isOdd(myArray[i])){
myArray.splice(i,1);
i--;
}
}
上記のコードは任意の長さの配列をとり、各値をチェックします。配列のビットの値が任意の条件を満たす場合(この場合は奇数の場合)、アレイから削除されます。JS配列の値をループして値を削除するときに、代わりにwhileを使用する必要がありますか?
Array.prototype.splice()
は、配列から値を削除するために使用されます。そして、i
は、削除された値が残っているギャップを埋めるために配列 "移動する"の残りの値を考慮して減算されます値をスキップする)。
しかし、i
が配列の長さと等しい場合、for
ループは終了します。これは値が削除されるにつれて短くなります。
myArray.length
の値は、ループの進行に伴って動的に減少するか、ループの開始時に値を保存し、値が削除されると更新されませんか?後者の場合は、ループを修正するために何ができますか?
ありがとうございました!
私がすることをお勧めしたいです高次の 'Array.prototype.filter()'メソッドがこの種の操作のためのより良い選択です。 'filter()'メソッドに依存するコードはかなり簡潔であり、私はかなり読みやすいと言います。 – Tex
あなたは正しいですが、問題はスプライスとループの欠点です。 –
@Tex - '.filter()'は確実に使いやすいですが、OPと同じ実装ではない元の配列を変更するのではなく、新しい配列を作成します。場合によっては、他のコードにこの配列への参照がある場合は、新しい配列で置き換えるのではなく、配列を変更することがあります。 – jfriend00