Wie kann ich ein bestimmtes Element aus einem Array in JavaScript entfernen?

Lesezeit: 7 Minuten

Walkers Benutzeravatar
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.

  • 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

Benutzeravatar von ujeenator
ujeenator

Bearbeitet am Oktober 2016

  • Mach es einfach, intuitiv und explizit (Ockhams Rasiermesser)
  • Tun Sie es unveränderlich (das ursprüngliche Array bleibt unverändert)
  • Tun Sie es mit Standard-JavaScript-Funktionen, wenn Ihr Browser sie nicht unterstützt – Füllwatte verwenden

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.

Artikel entfernen (ECMA-262 Edition 5 Code AKA Old Style JavaScript)

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 ]

Element entfernen (ECMAScript 6-Code)

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.


Mehrere Elemente entfernen (ECMAScript 7-Code)

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.

Mehrere Elemente entfernen (in Zukunft vielleicht)

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 deletees muss viele Optimierungen fallen lassen.

    – Slbox

    20. November 2022 um 2:34 Uhr

Benutzeravatar von xavierm02
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.

ALLE Instanzen aus einem Array entfernen

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

  1. 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']
    
  2. 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.

1443510cookie-checkWie kann ich ein bestimmtes Element aus einem Array in JavaScript entfernen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy