2011-08-05 16 views
22
var people = ['alex','jason','matt']; 

people.forEach(function(p){ 
    if(p.length > 4){ 
     //REMOVE THIS PERSON or pop it out of the list or whatever 
    } 
}); 

console.log(people) //should return ['alex','matt'] 

forEachループを使用して、リストから要素を削除したいとします。forEachを使用してリスト内の要素を削除するにはどうすればよいですか?

+1

私はあなたがそれ以上のあなたループとしてリストを修正することになっているとは思いません。 –

+2

何を試しましたか? SOは(本質的に)問題点です。教室ではありません。 –

+2

私はRafeとTomalakのコメントを2番目にしています。 Rafeの言葉を拡張するには:各ループの中の要素を削除するのは普通の習慣ではありません(ただし、JavaScriptがどのように処理するかはわかりませんが、おそらくうまくいくでしょう)。標準的なインデックスベースのforループを使うと(ほぼ確実に)より良い結果が得られます。最後の要素から逆方向にループすることをお勧めします。これにより、インデックス変数を調整することなく要素を削除できます。 Arrayのメソッドの詳細については、[MDN Array doco](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array)をご覧ください。 – nnnnnn

答えて

22

ループしている配列を変更しないでください。あなたは新しいものを作ることができます:

var newPeople = []; 
people.forEach(function(p){ 
    if(p.length <= 4){ 
     newPeople.push(p); 
    } 
}); 
+0

+1または削除するインデックスを保存してから削除してください。 –

+0

+1ですが、比較は '<='にする必要があります。 –

+0

@Hans Engel:完了! – Mrchief

48

正しい仕事に適切なツールを使いましょう。この場合:

for (var i = 0; i < data.length; i++) { 
    if (data[i].value === 5) { 
     data.splice(i--, 1); 
    } 
} 

または@nnnnnnを示唆しているように、後方ループ:

for (var i = data.length-1; i >= 0; i--) { 
    if (data[i].value === 5) { 
     data.splice(i, 1); 
    } 
} 

ただし、Array.prototype.filter()を使用して検討する必要があります。

data.filter(function (e) { 
    return e.value !== 5; 
}); 

またはユーティリティ関数ライブラリなどlodashまたはunderscoreであり、配列から要素を削除する機能を提供します。

_.remove(data, function (e) { 
    return e.value === 5; 
}); 

後者の2つの利点は、コードが読みやすくなることです。 ES5は、インデックスと一緒に使用することができますので、

+3

これはindeciesの変更の問題を考慮するきちんとした解決策です! –

+3

'.filter'は本当に素晴らしいと思われます –

1

のForEach、:

data.forEach(function (element, index) { 
    if (element % 2 == 0) { 
    data.splice(index, 1); 
    } 
}); 
+1

このコードスニペット*は実際には動作しません* - データが' [1,28,35,444,555,666,333,424,313,303,484,464,121,12,14,88,96,108,1224,777]ならばそれを '[1、35、555、333、313、303、464、121、14、96、1224、777] –

関連する問題