Javascript Array suchen und Zeichenfolge entfernen?

131

Ich habe:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Ich möchte in der Lage sein, etwas zu tun wie:

array.remove("B");

Es gibt jedoch keine Entfernungsfunktion. Wie schaffe ich das?

Rolando
quelle
5
Eine Kombination von .indexOf()und .splice()sollte den Trick machen. Oder vielleicht alternativ .filter().
Marc B
1
siehe hier: stackoverflow.com/questions/3954438/…
benedict_w

Antworten:

182

Ich aktualisiere diesen Thread tatsächlich mit einer neueren 1-Zeilen-Lösung:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

Die Idee besteht im Wesentlichen darin, das Array zu filtern, indem alle Elemente ausgewählt werden, die sich von dem Element unterscheiden, das Sie entfernen möchten.

Hinweis: Entfernt alle Vorkommen.

BEARBEITEN:

Wenn Sie nur das erste Vorkommen entfernen möchten:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']
Tyrannas
quelle
1
Diese Lösung gibt eine Kopie des Arrays zurück, während die Verwendung von Spleiß die vorhandenen Elemente entfernt. Welche Sie wählen, hängt vom Kontext ab.
Twhitehead
6
Dies ist perfekt für Redux-Inhalte, bei denen Sie einen neuen Status zurückgeben müssen.
Colinwong
@Regis eigentlich nicht, arr.filter gibt ein neues Array zurück. Arr.filter (e => e! == 'B') ändert also nicht arr. Oder habe ich Ihren Kommentar nicht richtig verstanden?
Tyrannas
Gibt es eine Methode, um dies zu tun, aber beim ersten Auftreten anzuhalten? Also, wenn es 5 'B gibt, um nur eines zu entfernen?
Ari
1
@ Ari Ich habe die Antwort für das Entfernen nur eines Elements aktualisiert
Tyrannas
171

Durchlaufen Sie die Liste in umgekehrter Reihenfolge und verwenden Sie die .spliceMethode.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

Die umgekehrte Reihenfolge ist wichtig, wenn alle Vorkommen des Suchbegriffs entfernt werden müssen. Andernfalls erhöht sich der Zähler und Sie überspringen Elemente.

Wenn nur das erste Vorkommen entfernt werden muss, funktioniert auch Folgendes:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}
Rob W.
quelle
1
Ich vermute, weil es etwas schneller sein soll, in umgekehrter Reihenfolge zu iterieren.
Ben Clayton
1
@ BenClayton: Danke. FWIW, in JavaScript, ist das nicht zuverlässig wahr. Das Herunterzählen auf 0ist nicht automatisch schneller als beispielsweise in C. Solange Sie das Limit zwischenspeichern, würde dies natürlich die Sache komplizieren, wenn Sie nach dem ersten Spiel weitermachen (aber nicht, wenn Sie damit aufhören).
TJ Crowder
Wenn wir Geschwindigkeit wollen, warum nicht verwenden, während -? : D
Snuffleupagus
11
Es geht nicht um Geschwindigkeit, sagt er sogar in seiner Antwort. Es geht um SKIPPING-Elemente. Wenn Sie sich an Position 5 befinden und diese Position verbinden, befindet sich die Elementformel an Position 6 jetzt bei 5 . Trotzdem erhöht sich Ihr Schleifenzähler, die nächste Iteration ist Position 6 und dort haben Sie ein Element übersprungen. Deshalb ist es in umgekehrter Reihenfolge.
Amenthes
1
Wenn Sie Elemente in einer Vorwärtsschleife entfernen und ein Element entfernt wird, kann die letzte Iteration Nullzeigerausnahmen auslösen, da sie auf einen nicht vorhandenen Index verweist
Drenai
23

Liste der Einzeiler

Lösen wir dieses Problem für dieses Array:

var array = ['A', 'B', 'C'];

1. Entfernen Sie nur das erste: Verwenden Wenn Sie sicher sind, dass das Element vorhanden ist

array.splice(array.indexOf('B'), 1);

2. Entfernen Sie nur das letzte: Verwenden Sie, wenn Sie sicher sind, dass das Element vorhanden ist

array.splice(array.lastIndexOf('B'), 1);

3. Entfernen Sie alle Vorkommen:

array = array.filter(v => v !== 'B'); 
enesn
quelle
21

DEMO

Sie müssen den Ort finden, mit dem Sie suchen .indexOf(), und ihn dann mit entfernen.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Dies wird sich um alle Vorkommnisse kümmern.

qwertymk
quelle
Für Browser, die dies nicht unterstützen .indexOf(), können Sie dies zu Ihrer Javascript-Datei hinzufügen .
QWertymk
Ja, elegant. Wenn Sie eine Option benötigen, um nur einige Elemente zu entfernen, z. B. nur das erste: dasselbe aktualisiert: jsfiddle.net/qpZFd/9
sebilasse
Ich bekomme immer folgenden Fehler : Uncaught ReferenceError: array is not defined. Was ist falsch?
Pathros
Wenn Sie diesen Weg gehen, können Sie leicht .indexOf()ein wenig mehr nutzen. Wenn Sie foundals zweites Argument an den .indexOf()Aufruf innerhalb der while-Schleife übergeben , werden die Elemente im Array, die bereits überprüft wurden und am Ende nicht gleich waren, nicht erneut überprüft: found = arr.indexOf(what, found);
Pimmhogeling
14

Einfach

array.splice(array.indexOf(item), 1);
Matt
quelle
Ja, außer dass indexOf zurückkehrt, -1wenn nichts gefunden wird und whoops, splice löscht 1 Element am Ende des Arrays
Ricky Spanish
2

Einfache Lösung (ES6)

Wenn Sie kein doppeltes Element haben

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Online-Demo (Geige)

Ali Soltani
quelle
Diese Lösung entfernt immer das letzte Element, wenn KEINE Übereinstimmung gefunden wird.
Markus s
1

Sie müssen schreiben, dass Sie selbst entfernen. Sie können das Array durchlaufen, den Index des Elements abrufen, das Sie entfernen möchten, und es splicezum Entfernen verwenden.

Alternativ können Sie ein neues Array erstellen, das aktuelle Array durchlaufen und das aktuelle Objekt, wenn es nicht mit dem übereinstimmt, was Sie entfernen möchten, in ein neues Array einfügen.

hvgotcodes
quelle
1

verwenden:

array.splice(2, 1);

Dadurch wird ein Element aus dem Array entfernt, beginnend mit Index 2 (3. Element).

Ben Clayton
quelle
1
Tatsächlich wird das zweite Element aus dem Array entfernt, der Index beginnt bei Null. Diese Anweisung ist mehrdeutig. Ein einfacheres Beispiel könnte sein, bei array.splice(2,1)dem 1 Element am Index 2 aus dem Array entfernt wird. Weitere Informationen finden Sie unter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
imdzeeshan,
1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

oder Sie können verwenden:

const changedArray = array.filter( (value) => value === 'B');

Das geänderte Array enthält den Wert 'B' ohne Wert.

Siva Gopi
quelle