web-dev-qa-db-ja.com

JavaScriptで配列を反復処理して要素を削除する方法

要素の配列があり、特定の要素を削除する必要があります。問題は、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が変更され、境界をハードコーディングすると、配列の境界を超える要素を調べようとしている可能性があることです。それでは、この信じられないほど単純なことを行う最良の方法は何ですか?

67
Captain Stack

上から始めましょう!

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

ここで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]
30
KooiInc
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);
5
rouble

アイテムを削除するたびに、単に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);
1
Lachmanski

Array.shift() を使用:

var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
  console.log(array.shift());
}

編集:おそらく仕様に適合していません。私は質問を誤解し(certain要素のみを削除します)、代わりにまだ言及されていないメソッドを追加するには熱心すぎました...

1
Geert

これは、 Array.indexOfwhile 、および 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

0
Xotic750