Entfernen von Elementen mit Array.map in JavaScript
Ich würde gerne filter ein array von Elementen mithilfe der map()
Funktion. Hier ist ein code-snippet:
var filteredItems = items.map(function(item)
{
if( ...some condition... )
{
return item;
}
});
Das problem ist, dass die gefilterten Elemente verwendet immer noch Platz im array und ich möchte, um vollständig wischen Sie Sie heraus.
Irgendeine Idee?
EDIT: Danke, ich vergaß filter()
, was ich wollte, ist eigentlich ein filter()
dann ein map()
.
EDIT2: Danke für den Hinweis, dass map()
und filter()
sind nicht in allen Browsern implementiert, obwohl meine spezifischen code war nicht beabsichtigt, in einem browser laufen.
Kommentar zu dem Problem
Bitte verwenden Sie die
reduzieren
anstatt sich zu verdoppeln, Iterationen mit map -> filter
. Ich habe Angst, dass die Leute kommen, um diese Frage falsch zu Lesen dies, ohne auf Antworten und schließlich lernen, dass es einen besseren Weg. Können Sie näher erläutern, warum 2 Iterationen sind die schlimmsten, die 1 ? Ich meine, 2*O(n) äquivalent ist zu O(2*n) zu mir...
Ja, 20 * 2 & 10 * 4 sind die gleichen... Aber, während Sie die gleiche Anzahl von Operationen innerhalb Ihres filters/map-Funktionen, können Sie die doppelte Anzahl von Funktionsaufrufen zu tun. filter(f) -> Karte(g) vs. verringern(h). Jeder Funktionsaufruf verursacht einige Kosten. (Ja, in der Regel vernachlässigbar, aber map/filter/reduce sind die Arten von Funktionen, die auf sehr große Listen, in denen diese Kosten können spürbar werden). Ich werde versuchen, einige jsperf tests später zu illustrieren (und zu überprüfen), und aktualisieren Sie meine Antwort und dieser Kommentar zu dieser Zeit. (Alle, abgesehen, ist dies ein Idealer Anwendungsfall für reduzieren.)
InformationsquelleAutor der Frage Vincent Robert | 2008-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die
filter
Methode eher als Karte, es sei denn, Sie wollen mutieren Sie die Elemente in das array, zusätzlich zu filtern.zB.
[Edit: natürlich könnte man immer tun
sourceArray.filter(...).map(...)
zu filter und mutieren]InformationsquelleAutor der Antwort olliej
Schrieb ich diese Antwort wieder eine Weile jetzt und meine Ansichten haben sich geändert. Ich empfehle, Check-out meine blog-post die erweitert wird dieses Thema auf und erklärt es viel besser. Es gibt auch ein JSperf-Vergleich am Ende der alternativen.
Das tl;dr ist:
Das zu erreichen, was Sie für Fragen (Filter-und mapping innerhalb eines function call) verwenden, sollten Sie
Array.reduce()
. Jedoch, die mehr lesbar und in der Regel schneller Ansatz ist, nur mit filter und map verkettet:[1,2,3].filter(num => num > 2).map(num => num * 2)
Was folgt, ist eine Beschreibung, wie
Array.reduce()
Werke, und wie kann es verwendet werden, um zu erreichen, filtern und anzeigen in einer iteration. Wenn diese ist auch verdickt, ich empfehle das sehen des oben verlinkten blog-post, die eine viel mehr freundliche intro mit klaren Beispielen und progression.Geben Sie reduzieren ein argument, das ist eine (meist anonyme) Funktion.
, Dass die anonyme Funktion nimmt zwei Parameter--(wie der anonyme Funktionen übergeben map/filter/forEach) ist der iteratee, betrieben werden. Es ist ein weiteres argument für die anonyme Funktion übergeben, zu reduzieren, jedoch, dass diese Funktionen nicht akzeptieren, und das ist der Wert, der übergeben werden, zusammen zwischen Funktionsaufrufen, die oft als die memo.
Beachten Sie, dass beim Array.filter() akzeptiert nur ein argument (eine Funktion), Array.reduce() nimmt auch einen wichtigen (aber optionalen) zweiten Arguments: einen ersten Wert für 'memo', die übergeben werden, in die anonyme Funktion als erstes argument, und anschließend mutiert weitergegeben und so entlang zwischen Funktionsaufrufen. (Wenn es nicht angegeben ist, dann 'memo' in den ersten anonymen Funktion aufrufen, wird standardmäßig die erste iteratee, und die 'iteratee' argument tatsächlich der zweite Wert im array)
In unserem Fall, wir kommen in ein leeres array zu starten, und wählen Sie dann, ob Sie injizieren unsere iteratee in unser array ist oder nicht, basierend auf unsere Funktion-das ist die Filterung.
Schließlich, wir werden zurückkehren, unsere 'array in progress" auf jede anonyme Funktion aufrufen, und reduzieren Sie mit diesem Rückgabewert und übergeben es als argument genannt (memo) zu seiner nächsten Aufruf der Funktion.
Diese ermöglicht das filtern und anzeigen passieren in einer iteration, schneiden wir die Anzahl der benötigten Iterationen in der Hälfte. 🙂
Für eine ausführlichere Erklärung finden Sie MDN oder den link oben. 🙂
Grundlegendes Beispiel für eine Reduzierung Aufruf:
kurz und bündig version:
Bemerken, dass der erste iteratee war nicht größer als eins ist, und so gefiltert wurde. Beachten Sie auch die initialMemo, den Namen nur, um seine Existenz klar und die Aufmerksamkeit darauf lenken. Noch einmal, es ist übergeben, als 'memo', um die erste anonyme Funktion aufrufen, und dann ist der zurückgegebene Wert die anonyme Funktion übergeben wird, als die 'memo' - argument, um die nächste Funktion.
Weiteres Beispiel für den klassischen use-case für memo wäre die Rückgabe der kleinsten oder größten Zahl in einem array. Beispiel:
Ein Beispiel, wie man schreiben Sie Ihre eigene Funktion reduzieren (das hilft oft Verständnis-Funktionen, wie diese, finde ich):
In der realen Implementierung erlaubt den Zugriff auf Dinge wie den index, zum Beispiel, aber ich hoffe, dies hilft Ihnen ein unkompliziertes Gefühl für das wesentliche.
InformationsquelleAutor der Antwort Kyle Baker
Nicht, was die Karte tut. Sie wirklich wollen,Array.filter. Oder wenn Sie wirklich wollen, entfernen Sie die Elemente aus der ursprünglichen Liste, du wirst es tun müssen zwingend mit einer for-Schleife.
InformationsquelleAutor der Antwort Patrick
Beachten Sie jedoch, dass die
Array.filter
wird nicht unterstützt alle browser, so müssen Sie, um einen Prototypen:Und können dabei Vorbild jede Methode, die Sie benötigen.
InformationsquelleAutor der Antwort ggasp
Ich lege diese Antwort hier, denn die polyfills geteilt auf dieser Seite sind miserabel
erweitern Prototypen
InformationsquelleAutor der Antwort user633183
InformationsquelleAutor der Antwort vsync