Gibt es in JavaScript eine ähnliche Funktion wie Python range()
?
Ich denke, es sollte einen besseren Weg geben, als jedes Mal die folgenden Zeilen zu schreiben:
array = new Array();
for (i = 0; i < specified_len; i++) {
array[i] = i;
}
javascript
python
Clwen
quelle
quelle
range()
in Python zu emulieren , damit Sie sie verwenden können. In JavaScript gibt es keine solche Funktion, aber es gibt einige Plugins für verschiedene Frameworks, z. B. dieRange
Klasse für MooTools .Antworten:
Nein , es gibt keine, aber Sie können eine machen .
JavaScript-Implementierung von Python
range()
Beim Versuch zu emulieren, wie es in Python funktioniert, würde ich eine ähnliche Funktion erstellen:
Siehe diese jsfiddle für einen Beweis.
Vergleich zwischen
range()
in JavaScript und PythonEs funktioniert folgendermaßen:
range(4)
kehrt zurück[0, 1, 2, 3]
,range(3,6)
kehrt zurück[3, 4, 5]
,range(0,10,2)
kehrt zurück[0, 2, 4, 6, 8]
,range(10,0,-1)
kehrt zurück[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
,range(8,2,-2)
kehrt zurück[8, 6, 4]
,range(8,2)
kehrt zurück[]
,range(8,2,2)
kehrt zurück[]
,range(1,5,-1)
kehrt zurück[]
,range(1,5,-2)
kehrt zurück[]
,und sein Python-Gegenstück funktioniert genauso (zumindest in den genannten Fällen):
Wenn Sie also eine Funktion benötigen, die ähnlich wie bei Python funktioniert
range()
, können Sie die oben genannte Lösung verwenden.quelle
stop
größer sind alsstart
(und tauschen Sie sie aus, wenn nicht).start >= stop
Führen zu einem leeren Array ist notwendig, wenn das Ziel wirklich die Reichweite von Python emuliert. Und ich würde behaupten, es ist sowieso intuitiver.start >= stop
diese Funktion nicht ausreicht, um sich wierange()
in Python zu verhalten . Ich habe meine Antwort aktualisiert.Für einen sehr einfachen Bereich in ES6:
Aus dem Kommentar von bigOmega geht hervor , dass dies mithilfe der Spread-Syntax verkürzt werden kann :
quelle
let range = n => [...Array(n).keys()]
const
so viel wie möglich zu verwenden, aber hier wird es nur ein Verweis auf das Array sein, so dass das Array immer noch bearbeitet werden kann: 'Dconst
würde für die Funktion selbst gelten, nicht für ihren Rückgabewert. Sie möchten die Funktion wahrscheinlich in keiner Weise ändern.2018: Diese Antwort erhält immer mehr Stimmen. Hier ist ein Update. Der folgende Code ist veraltet, aber glücklicherweise standardisierte ES6-Generatoren und das
yield
Schlüsselwort und sie werden plattformübergreifend universell unterstützt. Ein Beispiel für die faulerange()
Verwendungyield
finden Sie hier .Zusätzlich zu dem, was bereits gesagt wurde, bietet Javascript 1.7+ Unterstützung für Iteratoren und Generatoren, mit denen eine faule, speichereffiziente Version von
range
ähnlich wiexrange
in Python2 erstellt werden kann:quelle
step
Argument implementieren und es anhand der Werte aus meiner Antwort testen ? Ihre Antwort eignet sich hervorragend für Anwendungen, bei denen wir ganz bestimmte Browser im Auge haben (sie funktionieren in Google Chrome- , Safari- und IE-Versionen vor 9 nicht: stackoverflow.com/a/2209743/548696 ).range
ist der "letzte" Wert ausgeschlossen (daher muss er>=
anstelle des>
obigen Codes verwendet werden)Beide Antworten von @Tadeck und zusammenführenIch habe @georg mir ausgedacht :
Um es in einer for-Schleife zu verwenden, benötigen Sie die for-of-Schleife von ES6 / JS1.7:
quelle
step
Parameter funktionieren , aber wennstop
nicht übergeben wird, müssen beidestart
undstop
müssen geändert werden. Ich werde es aktualisierenEin Port der
range
Funktion aus Python 2 wird von den Dienstprogrammbibliotheken underscore.js und lodash (zusammen mit vielen anderen nützlichen Tools) bereitgestellt . Beispiele, die aus den Unterstrichdokumenten kopiert wurden:quelle
Kann durch Anhängen eines Iterators an den
Number
Prototyp erreicht werdenEntnommen aus Kyle Simpsons Kurs Asynchrones JavaScript überdenken
quelle
Hier ist eine kleine Erweiterung für eine der Antworten, falls Sie sowohl die Start- als auch die Endposition des Bereichs angeben müssen:
quelle
Bitte schön.
Dadurch wird der Wert jedes Index mit der Indexnummer geschrieben (oder überschrieben).
Wenn Sie keine Nummer angeben, wird die aktuelle Länge des Arrays verwendet.
Verwenden Sie es so:
quelle
Um eine Reihe von Größen zu erhalten
x
, finden Sie hier einen Einzeiler ohne Verwendung einer Bibliothekarbeitet als
quelle
var range = n => Array(n).fill().map((e, i) => i);
x
' sagen, wenn Sie tatsächlichn
als Parametername verwendet habenDas Folgende ist eine natürliche Anpassung der Range () - Funktion von Python an JavaScript:
Es unterstützt jedes Argument , das verglichen werden kann
0
undstop
und kann erhöht werdenstep
. Es verhält sich identisch mit der Python-Version, wenn es mit Zahlen verwendet wird, die nicht größer sindNumber.MAX_SAFE_INTEGER
.Bitte beachten Sie die folgenden Eckfälle:
Im Gegensatz zu @ Tadeck des , @ Volv ist und @ janka102 die Antwort , die Rückkehr
[]
,undefined
oder eine Endlosschleife eingeben , wennstep
ausgewertet0
oderNaN
diese Generatorfunktion eine Ausnahme ähnlich wie Python Verhalten wirft.quelle
Weiter verfeinert mit ES6-Standardparametern.
quelle
pythonic
ahmt die Pythonrange
Verhalten am besten Generatoren ‚JS verwenden kann (yield
), sowohl die Unterstützungrange(stop)
undrange(start, stop, step)
Anwendungsfälle. Darüber hinauspythonic
‚srange
gibt Funktion einIterator
Objekt ähnlich wie Python , dass Trägermap
undfilter
, so man Lust haben könnte Einzeiler wie:Installieren Sie mit
npm
:Offenlegung Ich bin Autor und Betreuer von Pythonic
quelle
Sie können die Unterstrichbibliothek verwenden. Es enthält Dutzende nützlicher Funktionen für die Arbeit mit Arrays und vieles mehr.
quelle
Alle hier aufgeführten Lösungen beziehen sich auf den Bereich von Python 2 (wahrscheinlich aufgrund des von Ihnen angegebenen Codebeispiels). In Python 3 gibt die range () -Methode jedoch einen Iterator zurück. JavaScript hat auch Iteratoren und sie sind platzsparender als das Generieren des gesamten Arrays und das Speichern im Speicher.
Die genauere Darstellung der
range(n)
Funktion von Python 3 ist alsoArray(n).keys()
.Beispielsweise:
Ein weiteres Beispiel (das bereits in den anderen Antworten behandelt wurde). Konvertieren des Iterators in ein Array (ES6):
quelle
Hier ist eine weitere
es6
Implementierung des Sortimentsquelle
-20
bis generieren möchten-30
?Nein, es gibt keine, aber Sie können eine machen.
Ich bin Teil des Python3-Verhaltens der Reichweite. Nachfolgend finden Sie die JavaScript-Implementierung von Pythons range ():
quelle
Angenommen, Sie benötigen einen einfachen Bereich mit einem einzigen Schritt:
sonst
Weitere Informationen finden Sie hier .
quelle
Wie zuvor beantwortet: Nein , gibt es nicht. Aber du kannst deine eigenen machen. Ich glaube, dies ist ein interessanter Ansatz für ES6. Es funktioniert sehr ähnlich wie Python 2.7
range()
, ist aber viel dynamischer.Diese Funktion kann sich auf drei verschiedene Arten verhalten (genau wie Pythons range ()):
range(stop)
range(start, stop)
range(start, stop, step)
Diese Beispiele:
Gibt Ihnen die folgende Ausgabe:
Beachten Sie, dass Sie anstatt mit dem
in
Operator (wie Python) über das Array zu iterieren , verwenden müssenof
. Daher nimmt diei
Variable den Wert und nicht den Index des Array-Elements an.quelle
Immer noch keine integrierte Funktion, die gleichwertig ist
range()
, aber mit der neuesten Version - ES2015 - können Sie Ihre eigene Implementierung erstellen. Hier ist eine limitierte Version davon. Eingeschränkt, da der Schrittparameter nicht berücksichtigt wird. Nur min, max.Dies wird durch die
Array.from
Methode erreicht, mit der ein Array aus jedem Objekt mit einerlength
Eigenschaft erstellt werden kann.length
Wenn Sie also ein einfaches Objekt nur mit der Eigenschaft übergeben, wird ein ArrayIterator erstellt, der dielength
Anzahl der Objekte ergibt .quelle
MDN empfiehlt diesen Ansatz: Sequenzgenerator (Bereich)
quelle
Dies ist mein bevorzugter Weg. Hier können Sie eine oder zwei Eingaben wie in Python angeben.
quelle
Eine Option für NodeJs ist die Verwendung eines Puffers:
Das Schöne ist, dass Sie direkt im Puffer iterieren können:
Mit einem nicht initialisierten Array ist das nicht möglich:
Aber wer bei klarem Verstand einen Puffer für einen Zweck wie diesen benutzt;)
quelle
Hier ist, wie ich es mache
Ausgabe
quelle