Ich habe immer festgestellt, dass die range
Funktion in JavaScript fehlt, da sie in Python und anderen verfügbar ist. Gibt es eine präzise Möglichkeit, in ES2015 einen Zahlenbereich zu generieren?
EDIT: MEINE Frage unterscheidet sich von dem erwähnten Duplikat, da sie spezifisch für ES2015 und nicht für ECMASCRIPT-5 ist. Außerdem muss der Bereich bei 0 beginnen und nicht bei einer bestimmten Startnummer (obwohl es gut wäre, wenn das vorhanden wäre).
javascript
arrays
ecmascript-6
Aditya Singh
quelle
quelle
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Antworten:
Sie können den Spread-Operator für die Schlüssel eines frisch erstellten Arrays verwenden.
[...Array(n).keys()]
oder
Array.from(Array(n).keys())
Die
Array.from()
Syntax ist erforderlich, wenn Sie mit TypeScript arbeitenquelle
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
in Typescript nicht funktioniert? Ist es eine absichtliche Abweichung von anderen JS-Implementierungen?Array(5).keys().slice()
und in Scheiben schneiden ist keine Methode der Array - Iterator. Hier ist ein Beispiel dafür, dass es nicht funktioniert typescriptlang.org/play/…Ich habe auch einen intuitiveren Weg gefunden, indem ich
Array.from
:Jetzt gibt diese
range
Funktion alle Zahlen von 0 bis n-1 zurückEine modifizierte Version des Bereichs zu unterstützen
start
undend
ist:BEARBEITEN Wie von @ marco6 vorgeschlagen, können Sie dies als statische Methode verwenden, wenn es Ihrem Anwendungsfall entspricht
und benutze es als
quelle
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
Und dann überallArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
. Thouths?Mit Delta
Für Javascript
Für Typoskript
Aktualisieren
Bearbeiten
quelle
Array.from(Array(~~((to - from) / step) + 1).keys())
Für die Nummern 0 bis 5
quelle
Viele dieser Lösungen bauen auf der Instanziierung realer Array-Objekte auf, die die Arbeit für viele Fälle erledigen können, aber Fälle wie nicht unterstützen können
range(Infinity)
. Sie können einen einfachen Generator verwenden, um diese Probleme zu vermeiden und unendliche Sequenzen zu unterstützen:Beispiele:
quelle
In diesem Fall wäre es also schön, wenn sich das Number- Objekt mit dem Spread-Operator wie ein Array-Objekt verhalten würde.
Zum Beispiel Array- Objekt, das mit dem Spread-Operator verwendet wird:
Dies funktioniert folgendermaßen, da das Array-Objekt über einen integrierten Iterator verfügt.
In unserem Fall benötigen wir ein Number- Objekt, um eine ähnliche Funktionalität zu haben:
Zu diesem Zweck können wir einfach einen Zahleniterator für diesen Zweck erstellen.
Jetzt ist es möglich, mit dem Spread-Operator Bereiche von 0 bis N zu erstellen.
http://jsfiddle.net/01e4xdv5/4/
Prost.
quelle
Sie können eine Generatorfunktion verwenden, die den Bereich nur bei Bedarf träge erstellt:
Sie können eine Generatorfunktion höherer Ordnung verwenden, um den
range
Generator abzubilden :Wenn Sie furchtlos sind, können Sie den Generatoransatz sogar verallgemeinern, um einen viel größeren Bereich anzusprechen (Wortspiel beabsichtigt):
Beachten Sie, dass Generatoren / Iteratoren von Natur aus statusbehaftet sind, dh, dass bei jedem Aufruf von eine implizite Statusänderung auftritt
next
. Staat ist ein gemischter Segen.quelle
Bereich mit Schritt ES6, der ähnlich wie Python funktioniert
list(range(start, stop[, step]))
:Beispiele:
quelle
Delta unterstützen
quelle
Sie können dies auch mit einem Einzeiler mit Stufenunterstützung wie dieser tun:
((from, to, step) => ((add, arr, v) => add(arr, v, add))((arr, v, add) => v < to ? add(arr.concat([v]), v + step, add) : arr, [], from))(0, 10, 1)
Das Ergebnis ist
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.quelle
Diese Funktion gibt eine ganzzahlige Sequenz zurück.
quelle
in Typoskript
quelle
Array.from
und die Syntax zu verbreiten. Und dann ist es genau das gleiche wie die vorhandene Antwort.[...Array(n).keys()]
dies in Typescript nicht funktioniert.Array.from(Array(n).keys())
. Ich bin mir ziemlich sicher, dass es funktionieren sollte. Worauf überträgt sich das Literal mit der Spread-Syntax?Hier ist eine andere Variante, die nicht verwendet wird
Array
.quelle
Mit Generatoren können Sie jetzt die Zahlenfolge träge generieren und für große Bereiche weniger Speicher verwenden.
Während die Frage speziell ES2015 angibt, gehe ich davon aus, dass viele Typescript-Benutzer hier landen werden und die Konvertierung in ES unkompliziert ist ...
Die ersten beiden Funktionsdeklarationen dienen lediglich dazu, informativere Vorschläge zur Vervollständigung in Ihrer IDE bereitzustellen.
quelle