Angenommen, Sie haben ein Array-ähnliches Javascript ES6 Iterable, von dem Sie im Voraus wissen, dass es endlich lang ist. Wie können Sie es am besten in ein Javascript-Array konvertieren?
Der Grund dafür ist, dass viele js-Bibliotheken wie Unterstrich und lodash nur Arrays unterstützen. Wenn Sie also eine ihrer Funktionen auf einem Iterable verwenden möchten, muss sie zuerst in ein Array konvertiert werden.
In Python können Sie einfach die Funktion list () verwenden. Gibt es ein Äquivalent in ES6?
javascript
arrays
ecmascript-6
iterable
babeljs
Michael Bylstra
quelle
quelle
Array.from(iterable)
siehe ECMA-262 ed 6 Entwurf .Antworten:
Sie können Array.from oder den Spread-Operator verwenden .
Beispiel:
quelle
let m = new Map()
Datenstruktur: Um nur Werte der Karte zu erhalten, verwenden Sie denArray.from
Operator oder verteilen Sie ihnm.values()
, fürm.keys()
. Andernfalls erhalten Sie ein Array von Arrays :[[key, value], [key, value]]
.Zusammenfassung:
Array.from()
Funktion nimmt es eine iterable wie in Eingabe und gibt ein Array der iterable zurück....
in Kombination mit einem Array-Literal.Vorsichtsmaßnahme beim Kopieren von Arrays:
Beachten Sie, dass über diese Methoden nur eine flache Kopie erstellt wird, wenn Sie ein Array kopieren möchten. Ein Beispiel verdeutlicht das potenzielle Problem:
Hier wird aufgrund des verschachtelten Arrays die Referenz kopiert und kein neues Array erstellt. Wenn wir also das verschachtelte Array des alten Arrays mutieren, wird diese Änderung im neuen Array wiedergegeben (da sie sich auf dasselbe Array beziehen, wurde die Referenz kopiert).
Lösung für Vorbehalte:
Wir können das Problem der flachen Kopien lösen, indem wir mit einen tiefen Klon des Arrays erstellen
JSON.parse(JSON.stringify(array))
. Beispielsweise:quelle
Sie können die Array.from- Methode verwenden, die in ES6 hinzugefügt wird, jedoch nur Arrays und iterierbare Objekte wie Maps und Sets unterstützt (auch in ES6 enthalten). Für reguläre Objekte können Sie die toArray- Methode von Underscore oder die toArray-Methode von lodash verwenden, da beide Bibliotheken tatsächlich eine hervorragende Unterstützung für Objekte bieten, nicht nur für Arrays. Wenn Sie bereits Unterstrich oder Lodash verwenden, können diese das Problem glücklicherweise für Sie lösen und verschiedene Funktionskonzepte wie Map und Reduce für Ihre Objekte hinzufügen.
quelle
Der folgende Ansatz wurde für Karten getestet:
quelle
quelle
Sie könnten auch tun:
Oder "auf die harte Tour" mit der ES5 + Generatorfunktion ( Fiddle funktioniert im aktuellen Firefox):
Beide Ansätze sind jedoch sicherlich nicht empfehlenswert und lediglich ein Proof-of-Concept.
quelle