要素の配列があり、特定の要素を削除する必要があります。問題は、JavaScriptにfor eachループがないようであり、forループを使用すると、基本的に配列の境界を超える要素、またはインデックスが変更されるため配列内の要素をチェックしようとして問題が発生することです。 。私が何を意味するかをお見せしましょう:
var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = 0; i < elements.length; i++){
if(elements[i] == 5){
elements.splice(i, 1);
}
}
問題は、elements [1]が削除されると、elements [2]がelements [1]になることです。最初の問題は、いくつかの要素が検査されないことです。もう1つの問題は、.lengthが変更され、境界をハードコーディングすると、配列の境界を超える要素を調べようとしている可能性があることです。それでは、この信じられないほど単純なことを行う最良の方法は何ですか?
上から始めましょう!
var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = elements.length -1; i >= 0 ; i--){
if(elements[i] == 5){
elements.splice(i, 1);
}
}
ここでfilter
メソッドを使用できます。
var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;});
//=> elements now [1,3,2,4]
または、elements
に触れたくない場合:
var elementsfiltered
,elements = [1, 5, 5, 3, 5, 2, 4]
.filter( function(a){if (a!==5) this.Push(a); return true;},
elementsfiltered = [] );
//=> elementsfiltered = [1,3,2,4], elements = [1, 5, 5, 3, 5, 2, 4]
MDN documentation を参照してくださいfilter
または、Array.prototype
を拡張できます
Array.prototype.remove = Array.prototype.remove || function(val){
var i = this.length;
while(i--){
if (this[i] === val){
this.splice(i,1);
}
}
};
var elements = [1, 5, 5, 3, 5, 2, 4];
elements.remove(5);
//=> elements now [1,3,2,4]
var elements = [1, 5, 5, 3, 5, 2, 4];
var i = elements.length;
while (i--) {
if (elements[i] == 5) {
elements.splice(i, 1);
}
}
console.log(elements);
アイテムを削除するたびに、単にi
をデクリメントできます。
var elements = [1, 5, 5, 3, 5, 2, 4];
var l = elements.length;
for(var i = 0; i < l; i++){
if(elements[i] == 5){
elements.splice(i, 1);
i--;
}
}
console.log(elements);
Array.shift() を使用:
var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
console.log(array.shift());
}
編集:おそらく仕様に適合していません。私は質問を誤解し(certain要素のみを削除します)、代わりにまだ言及されていないメソッドを追加するには熱心すぎました...
これは、 Array.indexOf 、 while 、および Array.splice を使用して要素をインラインで削除する例です。
var elements = [1, 5, 5, 3, 5, 2, 4];
var remove = 5;
var index = elements.indexOf(remove);
while (index !== -1) {
elements.splice(index, 1);
index = elements.indexOf(remove);
}
console.log(elements);
オン jsfiddle