Ich versuche die neue Karte zu verwenden Objekt aus Javascript EC6 zu verwenden, da es bereits in den neuesten Firefox- und Chrome-Versionen unterstützt wird.
Aber ich finde es in der "funktionalen" Programmierung sehr eingeschränkt, weil es keine klassischen Karten-, Filter- usw. Methoden gibt, die gut mit a funktionieren würden [key, value]
Paar . Es hat ein forEach, aber das gibt NICHT das Rückrufergebnis zurück.
Wenn ich es map.entries()
von einem MapIterator in ein einfaches Array umwandeln könnte, könnte ich den Standard verwenden .map
,.filter
ohne zusätzliche Hacks.
Gibt es eine "gute" Möglichkeit, einen Javascript-Iterator in ein Array umzuwandeln? In Python ist das so einfach wie list(iterator)
... aber Array(m.entries())
ein Array mit dem Iterator als erstem Element zurückgeben !!!
BEARBEITEN
Ich habe vergessen anzugeben, dass ich nach einer Antwort suche, die überall dort funktioniert, wo Map funktioniert, was zumindest Chrome und Firefox bedeutet (Array.from funktioniert in Chrome nicht).
PS.
Ich weiß, dass es die fantastischen wu.js gibt, aber ihre Abhängigkeit von Traceur schreckt mich ab ...
quelle
Antworten:
Sie suchen nach der neuen
Array.from
Funktion , die beliebige Iterables in Array-Instanzen konvertiert:Es wird jetzt in Edge, FF, Chrome und Node 4+ unterstützt .
Natürlich kann es sinnvoll sein
map
,filter
ähnliche Methoden direkt auf der Iterator-Schnittstelle zu definieren , damit Sie die Zuordnung des Arrays vermeiden können. Möglicherweise möchten Sie auch eine Generatorfunktion anstelle von Funktionen höherer Ordnung verwenden:quelle
(value, key)
Paare und keine(value, index)
Paare empfängt .yourTransformation = function([key, value], index) { … }
Map
Schlüsselwertpaar. Daher macht es meiner bescheidenen Meinung nach keinen Sinn, Allgemeinesmap
undfilter
Funktionen für Iteratoren zu definieren . Stattdessen sollte jeder iterable Objekt seine eigene habenmap
undfilter
Funktionen. Dies ist sinnvoll, weilmap
undfilter
strukturerhaltende Operationen sind (vielleicht nicht,filter
abermap
sicher), und daher sollten die Funktionenmap
undfilter
die Struktur der iterierbaren Objekte kennen, über die sie abgebildet oder gefiltert werden. Denken Sie darüber nach, in Haskell definieren wir verschiedene Instanzen vonFunctor
. =)[...map.entries()]
oderArray.from(map.entries())
Es ist super einfach.
Wie auch immer - Iteratoren haben keine Reduktions-, Filter- und ähnlichen Methoden. Sie müssen sie selbst schreiben, da dies perfekter ist als das Konvertieren von Map in Array und zurück. Aber keine Sprünge machen Map -> Array -> Map -> Array -> Map -> Array, da dies die Leistung beeinträchtigt.
quelle
Array.from
wurde bereits von @Bergi abgedeckt.[iterator]
funktioniert es nicht, weil es in Chrome ein Array mit einem einzelneniterator
Element erstellt und[...map.entries()]
in Chrome keine akzeptierte Syntax istEs ist nicht nötig, ein
Map
in ein zu verwandelnArray
. Sie können einfach Objekte erstellenmap
undfilter
funktionierenMap
:Sie können beispielsweise einen Knall (dh ein
!
Zeichen) an den Wert jedes Eintrags einer Karte anhängen, deren Schlüssel ein Grundelement ist.Man könnte auch hinzufügen
map
undfilter
Methoden auf ,Map.prototype
um es besser zu machen lesen. Obwohl es im Allgemeinen nicht ratsam ist, native Prototypen zu modifizieren, glaube ich, dass eine Ausnahme im Fall vonmap
undfilter
für Folgendes gemacht werden kannMap.prototype
:Edit: In Bergis Antwort schuf er generische
map
undfilter
Generatorfunktionen für alle iterierbaren Objekte. Der Vorteil ihrer Verwendung besteht darin, dass sie, da sie Generatorfunktionen sind, keine iterierbaren Zwischenobjekte zuweisen.Zum Beispiel erstellen meine
map
undfilter
die oben definierten Funktionen neueMap
Objekte. Daher werden durch das Aufrufenobject.filter(primitive).map(appendBang)
zwei neueMap
Objekte erstellt:Das Erstellen von iterierbaren Zwischenobjekten ist teuer. Bergis Generatorfunktionen lösen dieses Problem. Sie ordnen keine Zwischenobjekte zu, sondern ermöglichen es einem Iterator, seine Werte träge dem nächsten zuzuführen. Diese Art der Optimierung wird in funktionalen Programmiersprachen als Fusion oder Entwaldung bezeichnet und kann die Programmleistung erheblich verbessern.
Das einzige Problem, das ich mit Bergis Generatorfunktionen habe, ist, dass sie nicht objektspezifisch
Map
sind. Stattdessen werden sie für alle iterierbaren Objekte verallgemeinert. Anstatt die Rückruffunktionen mit(value, key)
Paaren aufzurufen (wie ich es bei der Zuordnung über a erwarten würdeMap
), werden daher die Rückruffunktionen mit(value, index)
Paaren aufgerufen . Ansonsten ist es eine ausgezeichnete Lösung und ich würde definitiv empfehlen, sie gegenüber den von mir bereitgestellten Lösungen zu verwenden.Dies sind also die spezifischen Generatorfunktionen, die ich zum Zuordnen und Filtern von
Map
Objekten verwenden würde:Sie können wie folgt verwendet werden:
Wenn Sie eine flüssigere Benutzeroberfläche wünschen, können Sie Folgendes tun:
Hoffentlich hilft das.
quelle
Map
Objekte mithilfe von Spezialfunktionenmap
undfilter
Funktionen korrekt zu transformieren . Bergis Antwort zeigt die Verwendung von Generikamap
undfilter
Funktionen für alle iterierbaren Objekte, die nicht zum Transformieren vonMap
Objekten verwendet werden können, da die Schlüssel desMap
Objekts verloren gehen.Array.from
dies in Chrome nicht funktioniert (während Map und Iteratoren dies tun!). Aber ich kann sehen, dass der Ansatz sehr ähnlich ist und Sie könnten einfach die "toArray" -Funktion zu Ihrem Haufen hinzufügen!toArray
Funktion hinzugefügt wird.Ein kleines Update von 2019:
Jetzt scheint Array.from universell verfügbar zu sein und akzeptiert außerdem ein zweites Argument mapFn , das verhindert, dass ein Zwischenarray erstellt wird. Das sieht im Grunde so aus:
quelle
Array.from
vorhanden ist, ist dies eher als Kommentar oder angeforderte Bearbeitung dieser Antwort geeignet ... aber danke!Sie können eine Bibliothek wie https://www.npmjs.com/package/itiriri verwenden , die Array-ähnliche Methoden für Iterables implementiert:
quelle
Sie können das Array von Arrays (Schlüssel und Wert) erhalten:
Und dann können Sie ganz einfach Werte von innen abrufen, wie zum Beispiel die Schlüssel mit dem Karteniterator.
quelle
Sie können auch fließend iterierbar verwenden, um in ein Array umzuwandeln:
quelle