4

次のような配列があるとします。

myArray = ["a","b","c","d","e"]

そして、それをループして特定の値を見つけて削除したいと思います。

for(var i=0;i<myArray.length;i++){
    if(myArray[i] == "b")
        myArray.splice(i,1)
}

問題は、スプライスが配列から項目を削除し、削除された項目の前にあるすべての項目がインデックス番号を下にシフトするため、myArray.length5 としてインスタンス化されましたが、その後のsplice myArray長さは 4 しかなく、typeof がスローされるためforループが失敗しますmyArray[4]フレームワークの一致エラー。

私はこのように機能するフレームワークを使用しています。そのため、このようなアイテム削除手法を利用しています。私の質問は、これを正しい方法で行うにはどうすればよいですか? フレームワークはspliceメソッドを使用し、私はforループを使用しているので、これについて正しい方法があると思いますか?

4

5 に答える 5

5

ループを逆にします。

for(var i=myArray.length-1;i>=0;i--){
    if(myArray[i] == "b")
        myArray.splice(i,1)
}
于 2015-10-22T15:08:01.393 に答える
1

を使用する必要がある場合は、ループ内でインクリメントし、アイテムが削除された場合は単にインクリメントしないようにspliceすることができます。i

for(var i = 0; i < myArray.length;) {
  if(myArray[i] == "b") {
    myArray.splice(i, 1);
  } else {
    ++i;
  }
}
于 2015-10-22T15:07:46.003 に答える
1

filter()を使用して、必要な要素を決定することを検討してください。例えば:

var myArray = ["a","b","c","d","e"];
var myNewArray = myArray.filter(function(elem) { return elem !== "b"; });
于 2015-10-22T15:03:48.227 に答える
1

フィルター機能を使用します。

var myArray = ["a","b","c","d","e"];
myArray.filter(function(item) {
    return item !== "b";
});
于 2015-10-22T15:04:49.923 に答える
0

iからに置き換えるだけi++ですmyArray.splice(i,1)

for(var i = 0; myArray[i]; i++){
    if(myArray[i] == "b")
        myArray.splice(i++,1)
}
于 2015-10-22T15:20:12.273 に答える