8
var fruit = ["apple","pear","pear","pear","banana"];

この配列からすべての「ナシ」フルーツを削除するにはどうすればよいですか?
私は次のことを試しましたが、まだ1つのナシが残っています:

for(var f in fruit) {
    if ( fruit[f] == "pear" ) {
        fruit.splice(f, 1);
    }
}

for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}

出力:

apple 
pear 
banana

私は何を間違っていますか? ライブデモ: http://jsfiddle.net/SbxHc/

4

10 に答える 10

25
var fruit = ["apple", "pear", "pear", "pear", "banana"],
    i;

for (i = 0; i < fruit.length; ++i) {
    if (fruit[i] === "pear") {
        fruit.splice(i--, 1);
    }
}

console.log(fruit);
//["apple", "banana"]
于 2012-06-15T21:27:21.633 に答える
7
for (var i = fruit.length - 1; i > -1; i--) {
    if (fruit[i] == "pear")
        fruit.splice(i, 1);
}
于 2012-06-15T21:28:27.140 に答える
3

配列を反復処理するときに配列から項目を削除する場合、通常、現在のインデックスが項目を削除するときに項目をスキップしないように、逆方向に反復します。

var fruit = ["apple","pear","pear","pear","banana"];
var i;

for (i = fruit .length - 1; i >= 0; i--) {
    if (fruit [i] === "pear") {
        fruit .splice(i, 1);
    }        
}

console.log(fruit );
于 2012-06-15T21:34:16.207 に答える
2

元の配列に「間違った」要素がたくさんある場合は、少なくともインプレース配列を使用しないことを検討し、代わりにすべての「正しい」要素を新しい配列に集めることをお勧めします。

var rightFruits = [];
for (var i = 0, len = fruit.length; i < len; ++i) {
  if (fruit[i] !== 'pear') {
    rightFruits.push(fruit[i]);
  }
}
于 2012-06-15T21:32:46.263 に答える
1
var i;
for (i = 0; i < fruits.length; i += 1) {
   if (fruits[i] == "pear") {
      fruits.splice(i, 1);
      i -= 1;
   }
}

6.4. 列挙

JavaScript の配列は実際にはオブジェクトであるため、for inステートメントを使用して配列のすべてのプロパティを反復処理できます。残念ながら、for inはプロパティの順序について保証しておらず、ほとんどの配列アプリケーションは、要素が番号順に生成されることを想定しています。また、予期しないプロパティがプロトタイプ チェーンからドレッジされるという問題がまだあります。

幸いなことに、従来の for ステートメントはこれらの問題を回避します。JavaScript の for ステートメントは、ほとんどの C ライクな言語の for ステートメントに似ています。これは 3 つの句によって制御されます。1 つ目はループを初期化し、2 つ目は while 条件、3 つ目はインクリメントを行います。

var i;
for (i = 0; i < myArray.length; i += 1) {
   document.writeln(myArray[i]);
}
于 2012-06-15T21:33:45.327 に答える
0

リストを逆方向に反復しないのはなぜですか? そうすれば、リストから要素を削除して長さが変わっても、ループ ロジックが壊れることはありません。

var fruit = ["apple","pear","pear","pear","banana"];
for (var i = fruit.length - 1; i >= 0; i--) {
    if (fruit[i] === "pear") {
        fruit.splice(i, 1);
    }
}

console.log(fruit); // ["apple", "banana"]
于 2014-10-24T21:38:00.050 に答える
0
var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1);

Array.indexOf は IE8 以下ではサポートされていないことに注意してください。-_-

于 2013-08-12T03:05:22.743 に答える
-1
for(var f in fruit) {
    if ( fruit[f] == "pear" ) {
        fruit.splice(f-1, 1);
    }
}

for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}

楽しい

于 2012-06-15T21:29:02.773 に答える