Wie hebe ich ein Element in einem Array in Javascript auf?

138

Wie entferne ich den Schlüssel 'bar' aus einem Array foo, damit 'bar' nicht in angezeigt wird

for(key in foo){alert(key);}
Steven Noble
quelle

Antworten:

243

Verwenden Sie nicht delete, da dadurch kein Element aus einem Array entfernt wird. Es wird nur als undefiniert festgelegt, was sich dann nicht korrekt in der Länge des Arrays widerspiegelt.

Wenn Sie den Schlüssel kennen, sollten Sie Spleiß verwenden, dh

myArray.splice(key, 1);

Für jemanden in Stevens Position können Sie so etwas ausprobieren:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

oder

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}
gehen
quelle
3
+1 Guter Punkt, ich mag auch diesen Weg: ejohn.org/blog/javascript-array-remove
CMS
3
@ThiefMaster - Möchtest du das erklären? Ich weiß nicht was das bedeutet und möchte lernen. Wie immer ist eine Bearbeitung 1.000.000 Mal besser als ein Kommentar aus der Hand. Sie sollten das mit der Anzahl der Wiederholungen wissen, die Sie haben.
Gehen
21
Verwenden Sie for (var key in myArray)anstelle von for (key in myArray)- andernfalls keyhandelt es sich um eine globale Variable. Wenn Sie eine Funktion in dieser Schleife aufrufen, die dasselbe Problem aufweist, erhalten Sie unerwartete Ergebnisse.
ThiefMaster
2
Beachten Sie, dass das zweite Beispiel nicht funktioniert, wenn das Array mehrere Elemente in einer Zeile enthält, die mit 'bar' übereinstimmen. Der Index des Arrays verschiebt sich und Sie vermissen das Spleißen der Hälfte der Elemente. Verwenden Sie stattdessen eine for-Schleife, die den Index dekrementiert, wenn eine Übereinstimmung gefunden wird.
Dave Lancea
Für eine Reihe von Objekten: stackoverflow.com/questions/15287865/…
Fedir RYKHTIK
52
delete foo[key];

: D.


quelle
4
technisch beantwortet das die frage nicht. Er versucht, die Schlüsselleiste zu entfernen. und Ihre Schlüsselvariable impliziert das nicht. : P
Kon
4
key = 'bar'; eval ("delete foo." + key); versteckt sich - D
olliej
3
Sie NICHT verwenden eval. Das Löschen eines Schlüssels / Index eines Objekts / Arrays kann durch viel einfachere Methoden erreicht werden, die nicht verwendet werden eval.
Dinei
4
Wenn Sie durch Löschen von foo [Schlüssel] aus dem indizierten Array entfernen, wird der Wert in foo [Schlüssel] = undefiniert gespeichert, und foo.length bleibt gleich, was falsch ist. Verwenden Sie stattdessen SPLICE
Иванов
benutze delete foo [key] es ist falsch; sollte foo.splice verwenden (Schlüssel, 1);
vnguyen
38

Ein wichtiger Hinweis: JavaScript-Arrays sind keine assoziativen Arrays, wie Sie sie von PHP gewohnt sind. Wenn Ihr "Array-Schlüssel" eine Zeichenfolge ist, bearbeiten Sie den Inhalt eines Arrays nicht mehr. Ihr Array ist ein Objekt, und Sie verwenden die Klammernotation, um auf das Mitglied mit dem Namen <Schlüsselname> zuzugreifen. So:

var myArray = [];
myArray ["bar"] = true;
myArray ["foo"] = true;
alert (myArray.length); // gibt 0 zurück.

Da Sie dem Array keine Elemente hinzugefügt haben, haben Sie nur die Balken- und Foo-Mitglieder von myArray geändert.

John Factorial
quelle
37

Wenn Sie den Schlüsselnamen kennen, gehen Sie einfach so vor:

delete array['key_name']
user3177525
quelle
2
Dies ist kein Array! Es ist ein Objekt (ja, diese werden in JS als assoziative Arrays bezeichnet, aber nein, sie sind es nicht wirklich, und diese Methode ist schädlich, wenn Sie wirklich mit einem JS-Array arbeiten).
Winterzähler
3

So würde ich es machen

 myArray.splice( myArray.indexOf('bar') , 1) 
Stapelüberläufe
quelle
1
Die Methode Array.prototype.indexOf () sucht nach einem Wert innerhalb eines Arrays, nicht nach einem Schlüssel. Das wird also nicht funktionieren.
Nadav