Wie entferne ich einen bestimmten Wert aus einem Array? Etwas wie:
array.remove(value);
Einschränkungen: Ich muss verwenden Kern JavaScript. Rahmen sind nicht erlaubt.
Gehhilfe
Wie entferne ich einen bestimmten Wert aus einem Array? Etwas wie:
array.remove(value);
Einschränkungen: Ich muss verwenden Kern JavaScript. Rahmen sind nicht erlaubt.
ujeenator
Bearbeitet am Oktober 2016
In diesem Codebeispiel verwende ich array.filter(...)
Funktion zum Entfernen unerwünschter Elemente aus einem Array. Diese Funktion ändert das ursprüngliche Array nicht und erstellt ein neues. Wenn Ihr Browser diese Funktion nicht unterstützt (z. B. Internet Explorer vor Version 9 oder Firefox vor Version 1.5), sollten Sie dies in Erwägung ziehen Polyfilling mit core-js
.
var value = 3
var arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(function(item) {
return item !== value
})
console.log(arr)
// [ 1, 2, 4, 5 ]
let value = 3
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(item => item !== value)
console.log(arr)
// [ 1, 2, 4, 5 ]
WICHTIG ECMAScript 6 () => {}
Pfeilfunktionssyntax wird überhaupt nicht in Internet Explorer, Chrome vor Version 45, Firefox vor Version 22 und Safari vor Version 10 unterstützt. Um ECMAScript 6-Syntax in alten Browsern zu verwenden, können Sie verwenden BabelJS.
Ein zusätzlicher Vorteil dieser Methode ist, dass Sie mehrere Elemente entfernen können
let forDeletion = [2, 3, 5]
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(item => !forDeletion.includes(item))
// !!! Read below about array.includes(...) support !!!
console.log(arr)
// [ 1, 4 ]
WICHTIG array.includes(...)
Funktion wird in Internet Explorer überhaupt nicht unterstützt, Chrome vor Version 47, Firefox vor Version 43, Safari vor Version 9 und Edge vor Version 14, aber Sie können Polyfill mit core-js
.
Wenn die “This-Binding-Syntax” Vorschlag angenommen wird, können Sie Folgendes tun:
// array-lib.js
export function remove(...forDeletion) {
return this.filter(item => !forDeletion.includes(item))
}
// main.js
import { remove } from './array-lib.js'
let arr = [1, 2, 3, 4, 5, 3]
// :: This-Binding Syntax Proposal
// using "remove" function as "virtual method"
// without extending Array.prototype
arr = arr::remove(2, 3, 5)
console.log(arr)
// [ 1, 4 ]
Probieren Sie es selbst in BabelJS aus 🙂
Referenz
Was ist, wenn der Inhalt des Arrays Objekte und verschachtelte Objekte sind?
– Ranjeet Thorat
11. Januar 2021 um 9:51 Uhr
gibt der Filter kein leeres Array zurück, wenn die Bedingung nicht erfüllt ist? Sie müssen also sicher sein, dass das Element vorhanden ist, oder Sie erhalten es bei der Rückgabe leer.
– Juan de la Cruz
2. Dezember 2021 um 0:56 Uhr
Die obige Antwort würde jedoch nur für primitive Datentypen für JavaScript funktionieren, da die Objektgleichheit nicht streng ist
– Abreg
14. Dezember 2021 um 10:06 Uhr
Funktioniert nicht, wenn ich nur eine 3 aus dem Array entfernen möchte
– Kewal Shah
29. Juni 2022 um 1:15 Uhr
delete array[i]
würde die Leistung der Anwendung beeinträchtigen und gilt als schlechte Praxis
– Christian Vincenzo Traina
22. Juli 2022 um 8:09 Uhr
An diejenigen, die von der Suche hierher kommen: Stellen Sie sicher, dass Sie den Code verstehen. Beachten Sie beispielsweise, wie das Array rückwärts durchlaufen wird; das ist der einzige Weg splice
kann sicher in einer Schleife verwendet werden.
– Ketzeraffe
5. August 2022 um 20:20 Uhr
Um das zu ergänzen, was Christian gesagt hat, können Sie sich ansehen, wie der V8-Motor von Chrome funktioniert delete
. Wenn es trifft delete
es muss viele Optimierungen fallen lassen.
– Slbox
20. November 2022 um 2:34 Uhr
xavierm02
Es hängt davon ab, ob Sie einen leeren Platz behalten möchten oder nicht.
Wenn du Tun wollen einen leeren Steckplatz:
array[index] = undefined;
Wenn du nicht wollen einen leeren Steckplatz:
//To keep the original:
//oldArray = [...array];
//This modifies the array.
array.splice(index, 1);
Und wenn Sie den Wert dieses Elements benötigen, können Sie einfach das Element des zurückgegebenen Arrays speichern:
var value = array.splice(index, 1)[0];
Wenn Sie an beiden Enden des Arrays entfernen möchten, können Sie verwenden array.pop()
für das letzte bzw array.shift()
für den ersten (beide geben auch den Wert des Artikels zurück).
Wenn Sie den Index des Elements nicht kennen, können Sie verwenden array.indexOf(item)
um es zu bekommen (in a if()
um einen Artikel zu bekommen oder in a while()
alle zu bekommen). array.indexOf(item)
gibt entweder den Index oder zurück -1
wenn nicht gefunden.
Es ist irgendwie lustig, dass Splice ein anderes Array zurückgibt, das aus den entfernten Elementen besteht. Ich habe etwas geschrieben, bei dem angenommen wurde, dass Splice die neu geänderte Liste zurückgeben würde (wie es zum Beispiel unveränderliche Sammlungen tun würden). In diesem speziellen Fall, in dem nur ein Element in der Liste enthalten ist und dieses Element entfernt wird, ist die zurückgegebene Liste nach dem Zusammenfügen dieses einen Elements genau identisch mit der ursprünglichen. Also geriet meine App in eine Endlosschleife.
– Teddy
25. Juli 2020 um 10:55 Uhr
Ein Freund hatte Probleme in InternetExplorer 8 und zeigte mir, was er tat. Ich sagte ihm, es sei falsch, und er sagte mir, er habe hier die Antwort bekommen. Die aktuelle Top-Antwort funktioniert nicht in allen Browsern (z. B. Internet Explorer 8) und entfernt nur das erste Vorkommen des Elements.
function removeAllInstances(arr, item) {
for (var i = arr.length; i--;) {
if (arr[i] === item) arr.splice(i, 1);
}
}
Es durchläuft das Array rückwärts (da sich Indizes und Länge ändern, wenn Elemente entfernt werden) und entfernt das Element, wenn es gefunden wird. Es funktioniert in allen Browsern.
Es ist irgendwie lustig, dass Splice ein anderes Array zurückgibt, das aus den entfernten Elementen besteht. Ich habe etwas geschrieben, bei dem angenommen wurde, dass Splice die neu geänderte Liste zurückgeben würde (wie es zum Beispiel unveränderliche Sammlungen tun würden). In diesem speziellen Fall, in dem nur ein Element in der Liste enthalten ist und dieses Element entfernt wird, ist die zurückgegebene Liste nach dem Zusammenfügen dieses einen Elements genau identisch mit der ursprünglichen. Also geriet meine App in eine Endlosschleife.
– Teddy
25. Juli 2020 um 10:55 Uhr
Es gibt zwei Hauptansätze
spleißen(): anArray.splice(index, 1);
let fruits = ['Apple', 'Banana', 'Mango', 'Orange']
let removed = fruits.splice(2, 1);
// fruits is ['Apple', 'Banana', 'Orange']
// removed is ['Mango']
löschen: delete anArray[index];
let fruits = ['Apple', 'Banana', 'Mango', 'Orange']
let removed = delete fruits(2);
// fruits is ['Apple', 'Banana', undefined, 'Orange']
// removed is true
Seien Sie vorsichtig, wenn Sie die verwenden delete
für ein Array. Es ist gut zum Löschen von Attributen von Objekten, aber nicht so gut für Arrays. Es ist besser zu verwenden splice
für Arrays.
Denken Sie daran, wenn Sie verwenden delete
für ein Array könnten Sie falsche Ergebnisse erhalten anArray.length
. Mit anderen Worten, delete
würde das Element entfernen, aber den Wert der length-Eigenschaft nicht aktualisieren.
Sie können auch damit rechnen, dass nach der Verwendung von delete Löcher in den Indexnummern vorhanden sind, z. B. könnten Sie am Ende die Indizes 1, 3, 4, 8, 9 und 11 und die Länge wie vor der Verwendung von delete haben. In diesem Fall alle indiziert for
Schleifen würden abstürzen, da Indizes nicht mehr sequentiell sind.
Wenn Sie gezwungen sind, zu verwenden delete
aus irgendeinem Grund sollten Sie dann verwenden for each
Schleifen, wenn Sie Arrays durchlaufen müssen. Vermeiden Sie in der Tat immer die Verwendung von indexed for
Schleifen, ggf. Auf diese Weise wäre der Code robuster und weniger anfällig für Probleme mit Indizes.
array.remove(index) oder array.pull(index) würden sehr viel Sinn machen. splice ist sehr nützlich, aber eine remove()- oder pull()-Methode wäre willkommen … Suchen Sie im Internet, Sie werden eine Menge von “Was ist das Gegenteil von push() in JavaScript?” Fragen. Wäre toll, wenn die Antwort so einfach wie einfaches Englisch wäre: Pull!
– Gustavo Gonçalves
24. Oktober 2020 um 15:51 Uhr
Jeder, der diese Frage überprüft, sieht die Probleme im Zusammenhang mit der Verwendung
delete
für von Sasa erwähnte Arrays– Vaulstein
26. November 2021 um 8:10 Uhr
@Gustavo Gonçalves Ich verstehe das Problem nicht: die Gegenteil von
Array#push()
ist bekannt. (Das ist natürlich nicht das, wonach diese Frage fragt.)– Brian Drake
3. Februar 2022 um 13:29 Uhr