Ich suche nach einer effizienten Möglichkeit, alle Elemente aus einem Javascript-Array zu entfernen, wenn sie in einem anderen Array vorhanden sind.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Ich möchte myArray bearbeiten, um es in diesem Zustand zu belassen: ['a', 'd', 'e', 'f']
Mit jQuery verwende ich grep()
und inArray()
, was gut funktioniert:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Gibt es eine reine Javascript-Möglichkeit, dies ohne Schleifen und Spleißen zu tun?
javascript
arrays
Zapfhahn
quelle
quelle
.filter()
. Stattdessen verwenden Siefor
Schleifen. Sie können vermeiden,.splice()
dass die ursprüngliche Bestellung nicht gepflegt werden muss. Oder es gibt Möglichkeiten,.splice()
effizienter zu arbeiten, wenn Sie glauben, dass viele Elemente entfernt werden müssen.Antworten:
Verwenden Sie die
Array.filter()
Methode:Kleine Verbesserung, da die Browserunterstützung für
Array.includes()
zugenommen hat:Nächste Anpassung mit Pfeilfunktionen :
quelle
.difference()
was dies im Grunde tut.toRemove()
in Großbuchstaben und ändert den Rückruf vonel
nachel.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
Die
filter
Methode sollte den Trick machen:Wenn Ihr
toRemove
Array groß ist, kann diese Art von Suchmuster ineffizient sein. Es wäre performanter, eine Karte so zu erstellen, dass LookupsO(1)
eher als sindO(n)
.quelle
Wenn Sie ein Array von Objekten verwenden. Dann sollte der folgende Code die Magie ausführen, wobei eine Objekteigenschaft das Kriterium zum Entfernen doppelter Elemente ist.
Im folgenden Beispiel wurden Duplikate entfernt, um den Namen jedes Elements zu vergleichen.
Versuchen Sie dieses Beispiel. http://jsfiddle.net/deepak7641/zLj133rh/
quelle
Lodash hat auch hierfür eine Utility-Funktion: https://lodash.com/docs#difference
quelle
ECMAScript 6-Sätze können zur Berechnung der verschiedenen Elemente von zwei Arrays verwendet werden:
quelle
Ich habe gerade implementiert als:
Benutzen als:
quelle
prototypes
native Objekte zu erweitern, wie zArray
. Das kann einen langfristigen Konflikt mit der zukünftigen Entwicklung der Sprache haben ( sieheflatten
Fall )Wenn Sie kein neues ES5-Material verwenden können,
filter
stecken Sie wahrscheinlich in zwei Schleifen:quelle
quelle
Jetzt im Einzeiler-Geschmack:
Funktioniert möglicherweise nicht mit alten Browsern.
quelle
Sie können _.differenceBy von lodash verwenden
Beispielcode hier: CodePen
quelle
Wie wäre es mit dem einfachsten:
quelle
includes
Beachten Sie, dass dies vor ES7 nicht verfügbar ist.Der richtige Weg, um alle in einem anderen Array enthaltenen Elemente zu entfernen, besteht darin, das Quellarray zum gleichen Objekt zu machen, indem nur Elemente entfernt werden:
Oder CoffeeScript-Äquivalent:
Testen in Chrome Dev Tools:
Die Verwendung des Angular-Frameworks ist der beste Weg, um den Zeiger auf das Quellobjekt zu behalten, wenn Sie Sammlungen ohne große Anzahl von Beobachtern aktualisieren und neu laden.
quelle
Ich erstelle die Logik ohne integrierte Methoden. Bitte teilen Sie mir Optimierungen oder Änderungen mit. Ich habe im JS-Editor getestet, dass es gut funktioniert.
quelle