it-swarm.com.de

So iterieren Sie über ein Array und entfernen Elemente in JavaScript

Ich habe eine Reihe von Elementen und muss bestimmte davon entfernen. Das Problem ist, dass JavaScript anscheinend nicht für jede Schleife eine hat. Wenn ich eine for-Schleife verwende, stoße ich auf Probleme, wenn ich versuche, Elemente über die Grenzen des Arrays hinaus zu überprüfen, oder wenn Elemente im Array fehlen, weil sich die Indizes ändern . Lassen Sie mich Ihnen zeigen, was ich meine:

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

Das Problem ist, dass Elemente [2] zu Elementen [1] werden, wenn Elemente [1] entfernt werden. Das erste Problem ist also, dass einige Elemente niemals untersucht werden. Das andere Problem ist, dass .length sich ändert und wenn ich die Grenzen hart codiere, dann könnte ich versuchen, Elemente außerhalb der Grenzen des Arrays zu untersuchen. Also, was ist der beste Weg, um diese unglaublich einfache Sache zu tun?

67
Captain Stack

Beginnen Sie von oben!

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

Sie können hier die Methode filter verwenden:

var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;});
//=> elements now [1,3,2,4]

Oder wenn Sie elements nicht berühren möchten:

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]

Siehe MDN-Dokumentation für filter

Alternativ können Sie das 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

Sie können einfach i dekrementieren, wenn Sie ein Objekt entfernen.

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

Mit Array.shift () :

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

Edit: Entspricht wahrscheinlich nicht den Spezifikationen. Ich habe die Frage falsch verstanden (entferne nur bestimmte Elemente) und war zu eifrig, stattdessen eine Methode hinzuzufügen, die noch nicht erwähnt wurde ...

1
Geert

Dies ist ein Beispiel für die Verwendung von Array.indexOf , while und Array.splice , um Elemente inline zu entfernen.

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

On jsfiddle

0
Xotic750