Frage Wie entferne ich ein bestimmtes Element aus einem Array in JavaScript?


Ich habe eine ganze Reihe von Ganzzahlen, und ich benutze die .push() Methode, um Elemente hinzuzufügen.

Gibt es eine einfache Möglichkeit, ein bestimmtes Element aus einem Array zu entfernen? Das Äquivalent von etwas wie array.remove(int);.

Ich muss benutzen Ader JavaScript - Nein Rahmen sind erlaubt.


6102
2018-04-23 22:17


Ursprung


Antworten:


Finde das index des Array-Elements, das Sie entfernen möchten, und entfernen Sie diesen Index dann mit splice.

Die splice () -Methode ändert den Inhalt eines Arrays durch Entfernen   vorhandene Elemente und / oder neue Elemente hinzufügen.

var array = [2, 5, 9];
var index = array.indexOf(5);
if (index > -1) {
  array.splice(index, 1);
}
// array = [2, 9]

Der zweite Parameter von splice ist die Anzahl der zu entfernenden Elemente. Beachten Sie, dass splice ändert das Array an Ort und gibt ein neues Array zurück, das die Elemente enthält, die entfernt wurden.


Hinweis: Browser-Unterstützung für indexOf ist begrenzt


8887
2018-04-23 22:23



Ich weiß nicht, wie du es erwartest array.remove(int) sich benehmen. Ich kann mir drei Möglichkeiten vorstellen, die Ihnen vielleicht fehlen.

Um ein Element eines Arrays an einem Index zu entfernen i:

array.splice(i, 1);

Wenn Sie jedes Element mit Wert entfernen möchten number aus dem Array:

for(var i = array.length - 1; i >= 0; i--) {
    if(array[i] === number) {
       array.splice(i, 1);
    }
}

Wenn Sie nur das Element zum Index machen wollen i nicht mehr vorhanden, aber die Indizes der anderen Elemente sollen nicht geändert werden:

delete array[i];

892
2018-04-23 22:20



Herausgegeben am Oktober 2016

  • Mach es einfach, intuitiv und explizit (https://en.wikipedia.org/wiki/Occam%27s_razor)
  • Ist es unveränderlich (Original-Array bleibt unverändert)
  • Tun Sie es mit Standard-JS-Funktionen, wenn Ihr Browser sie nicht unterstützt - Verwenden Sie Polyfill

In diesem Codebeispiel verwende ich "array.filter (...)" Funktion, um unerwünschte Elemente aus dem Array zu entfernen, ändert diese Funktion nicht das ursprüngliche Array und erstellt ein neues Array. Wenn Ihr Browser diese Funktion nicht unterstützt (z. B. IE vor Version 9 oder Firefox vor Version 1.5), ziehen Sie die Verwendung in Betracht das Filterpolyfill von Mozilla.

Artikel entfernen (ECMA-262 Edition 5 Code alias Oldstyle 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 ]

Artikel entfernen (ES2015-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 ES2015 "() => {}" Pfeilfunktionssyntax wird in IE überhaupt nicht unterstützt, Chrome vor Version 45, Firefox vor Version 22, Safari vor Version 10. So verwenden Sie die ES2015-Syntax in alten Browsern, die Sie verwenden können BabelJS


Entfernen mehrerer Elemente (ES2016-Code)

Ein weiterer Vorteil dieser Methode besteht darin, 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 IE überhaupt nicht unterstützt, Chrome vor Version 47, Firefox vor Version 43, Safari vor Version 9 und Edge vor Version 14 so Hier ist Polyfill von Mozilla

Entfernen mehrerer Elemente (modernstes experimentelles JavaScript ES2018?)

// 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 :)

Referenz


669
2017-12-19 19:54



Hängt davon ab, ob Sie einen leeren Platz behalten wollen oder nicht.

Wenn Sie einen leeren Platz möchten, ist das Löschen in Ordnung:

delete array[ index ];

Wenn Sie dies nicht tun, sollten Sie die spleißen Methode:

array.splice( index, 1 );

Und wenn Sie den Wert dieses Elements benötigen, können Sie einfach das zurückgegebene Array-Element speichern:

var value = array.splice( index, 1 )[0];

Wenn Sie es in einer bestimmten Reihenfolge tun möchten, können Sie verwenden array.pop() für den letzten oder array.shift() für die erste (und beide geben auch den Wert des Artikels zurück).

Und wenn Sie den Index des Artikels nicht kennen, können Sie verwenden array.indexOf( item ) um es zu bekommen (in einem if() um einen Gegenstand oder in einem zu bekommen while() um alle zu bekommen). array.indexOf( item ) gibt entweder den Index oder -1 zurück, wenn nicht gefunden.


357
2018-04-23 22:32



Ein Freund hatte Probleme in Internet Explorer 8und zeigte mir, was er getan hat. Ich sagte ihm, dass es falsch war, und er sagte mir, er habe die Antwort hier bekommen. Die aktuelle Top-Antwort funktioniert nicht in allen Browsern (z. B. Internet Explorer 8) und entfernt nur das erste Vorkommen des Elements.

Entfernen Sie alle Instanzen aus einem Array

function remove(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 Indizes und Länge sich ändern, wenn Elemente entfernt werden) und entfernt das Element, wenn es gefunden wird. Es funktioniert in allen Browsern.


227
2017-08-10 19:21



Es gibt zwei Hauptansätze:

  1. spleißen(): anArray.splice(index, 1);

  2. löschen: delete anArray[index];

Seien Sie vorsichtig, wenn Sie delete für ein Array verwenden. Es ist gut zum Löschen von Attributen von Objekten, aber nicht so gut für Arrays. Es ist besser zu benutzen splice für Arrays.

Beachten Sie, dass 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, würde aber den Wert der Längeneigenschaft nicht aktualisieren.

Sie können auch erwarten, dass nach der Verwendung von delete, z. Sie könnten am Ende die Indizes 1,3,4,8,9,11 und die Länge haben, wie sie vor dem Löschen waren. In diesem Fall sind alle indiziert for Schleifen würden abstürzen, da Indizes nicht mehr sequenziell sind.

Wenn Sie gezwungen sind zu benutzen delete aus irgendeinem Grund, dann sollten Sie verwenden for each Schleifen, wenn Sie Arrays durchlaufen müssen. In der Tat sollten Sie möglichst keine indizierten For-Schleifen verwenden. Auf diese Weise wäre der Code robuster und weniger anfällig für Probleme mit Indizes.


131
2017-12-21 11:32



Array.prototype.remByVal = function(val) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === val) {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
}
//Call like
[1, 2, 3, 4].remByVal(3);

Array.prototype.remByVal = function(val) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === val) {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
}

var rooms = ['hello', 'something']

rooms = rooms.remByVal('hello')

console.log(rooms)


103
2018-04-23 22:20