2012-06-15 9 views
8
var fruit = ["apple","pear","pear","pear","banana"]; 

この配列から「pear」フルーツを削除するにはどうすればよいですか?
私は次のことを試してみましたが、それでも1個の梨が残る:javacriptのforeachループ内から特定の配列要素を削除する方法

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/

+2

'F'は偶数インデックス(番号)ではありません...待って! –

+2

'fruit = fruit.filter(function(f){return f!==" pear ";});' –

答えて

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"] 
+0

ありがとう!あなたのようなループを使わなければならないのですか? foreachバリアントを使用することも可能ですか? – Nick

+0

この['] .forEach()'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/forEach)を試してください。 –

+4

@ニックいいえ、不可能です。配列と一緒に 'for..in'を使用するべきではありません。 – Esailija

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

したがって、 'fruit [i] ==" pear "'部分はどこですか? –

+0

oeps、マカとの間違い、;-) – Tom

-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>");   
} 

は「間違った」要素の多くは、元の配列である場合、私は、少なくともその代わり収集、インプレース配列を使用していない考慮することをお勧め

+0

'f'は数字ではありません。 –

2

を楽しみますすべての '正しい' の要素を新しい配列に:

var rightFruits = []; 
for (var i = 0, len = fruit.length; i < len; ++i) { 
    if (fruit[i] !== 'pear') { 
    rightFruits.push(fruit[i]); 
    } 
} 
+0

ありがとう、以前はC#でこのアプローチを行っていました。スプライス()を使用するのではなく、そうするのはコストがかかりますか? – Nick

+0

余分な変数が1つあります –

+0

@Derekクイック質問:JavaScriptで配列がどのように実装されていますか? – raina77ow

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言語のような に似ています。これは、三節によって制御されている:最初のループを初期化し、第二は、while条件であり、第3は、インクリメント処理を行います。

var i; 
for (i = 0; i < myArray.length; i += 1) { 
    document.writeln(myArray[i]); 
} 
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); 
+0

確かに!あまりにも悪いことにはできませんが...私はちょうど怠け者だと思います。 :P – Nick

0
var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1); 

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

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"] 
0

を、あなたはしばらくの組み合わせを使用することができますし、配列のポップ機能

var daltons = [ 
    { id: 1, name: "Joe" }, 
    { id: 2, name: "William" }, 
    { id: 3, name: "Jack" }, 
    { id: 4, name: "Averell" } 
]; 

var dalton; 
while (dalton=daltons.pop()) { 
    console.log(dalton.name); 
} 

console.log(daltons); 
0

またfilterを使用することができます。

let noPears = fruits.filter(fruit => fruit != 'pear') 
関連する問題