In PHP können Sie ...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
Das heißt, es gibt eine Funktion, mit der Sie eine Reihe von Zahlen oder Zeichen abrufen können, indem Sie die oberen und unteren Grenzen überschreiten.
Ist hierfür nativ etwas in JavaScript integriert? Wenn nicht, wie würde ich es implementieren?
$R
Funktion, aber ansonsten denke ich nicht wirklich.Array.from("ABC") //['A', 'B', 'C']
Dies ist das Nächste, was ich für den zweiten Teil der Frage finden kann.split("")
es auchArray.apply(null, { length: 10 }).map(eval.call, Number)
Antworten:
Zahlen
Zeicheniteration
Wiederholung
Als Funktionen
Als getippte Funktionen
lodash.js
_.range()
FunktionAlte Nicht-Es6-Browser ohne Bibliothek:
(ES6 Kredit an Nils Petersohn und andere Kommentatoren)
quelle
(new Array(5)).map(function (value, index) { return index; })
nicht funktionieren würde? Dies kehrt[undefined × 5]
für mich in Chrome DevTools zurück.map()
oder einem seiner Freunde wiederholt werden .Array(5).fill()
ist auch kartierbarFür Zahlen können Sie ES6 verwenden
Array.from()
, das heutzutage in allen Funktionen außer IE funktioniert :Kürzere Version:
Längere Version:
Dadurch wird ein Array von 0 bis einschließlich 19 erstellt. Dies kann weiter auf eine dieser Formen verkürzt werden:
Unter- und Obergrenzen können ebenfalls angegeben werden, zum Beispiel:
Ein Artikel, der dies ausführlicher beschreibt: http://www.2ality.com/2014/05/es6-array-methods.html
quelle
Array.from()
Methode und schneller als beide:Array(20).fill().map((_, i) => i)
Array.from({length: end - start}, (v, k) => k + start)
undefined
, so dassfill()
(ohne Argument) per se nicht falsch ist . Der Füllwert wird in dieser Lösung nicht verwendet. Wenn Sie möchten, können Siefill(0)
einige Zeichen speichern.Meine neue Lieblingsform ( ES2015 )
Und wenn Sie eine Funktion mit einem
step
Parameter benötigen:quelle
stop
ist eigentlich nicht die Stopp- / Endposition, sondern Anzahl / Entfernung. (nichts für ungut, nur um die Leute auf den Tippfehler aufmerksam zu machen)Array(Math.ceil((stop - start) / step) + 1)
, braucht das+1
am Ende, um das "inklusive" Verhalten von PHP wirklich nachzuahmen.range
Methode vollständig implementiert . Alle anderen derzeit darüber liegenden (mit Ausnahme von lodashs_.range
) implementieren grundlegende Iteratoren anstelle einer tatsächlichen Bereichsfunktion mit Start, Stopp und SchrittHier sind meine 2 Cent:
quelle
Es funktioniert für Zeichen und Zahlen und geht mit einem optionalen Schritt vorwärts oder rückwärts.
jsFiddle .
Wenn es Ihr Ding ist, native Typen zu erweitern, weisen Sie es zu
Array.range
.Code-Snippet anzeigen
quelle
Einfache Bereichsfunktion:
Um den BitInt-Datentyp einzubeziehen, kann eine Prüfung durchgeführt werden, um sicherzustellen, dass alle Variablen gleich sind
typeof start
:Um Werte zu entfernen, die höher sind als durch
stop
zB definiert,range(0,5,2)
wird eingeschlossen6
, was nicht sein sollte.quelle
step != 1
diewhile
Bedingungstep
berücksichtigt werden muss. Meine aktualisierte Version mit einem Standardwertstep
: Funktionsbereich (Start, Stopp, Schritt) {Schritt = Schritt || 1 var a = [Start], b = Start; while ((b + Schritt) <Stopp) {console.log ("b:" + b + ". a:" + a + "."); b + = Schritt; a.push (b); } return a; }(step || 1)
.quelle
Array
Prototyp anwenden .undefined method toUpperCase to etc
!OK, in JavaScript haben wir keine
range()
Funktion wie PHP , daher müssen wir die Funktion erstellen, die recht einfach ist. Ich schreibe einige einzeilige Funktionen für Sie und trenne sie wie folgt für Zahlen und Alphabete :für Zahlen :
und nenne es wie:
für Alphabete :
und nenne es wie:
quelle
Array(end - start + 1)
undArray(end.charCodeAt(0) - start.charCodeAt(0) + 1)
.Praktische Funktion, um den Trick auszuführen, führen Sie das folgende Code-Snippet aus
Hier erfahren Sie, wie Sie es verwenden
Bereich (Start, Ende, Schritt = 1, Versatz = 0);
range(5,10) // [5, 6, 7, 8, 9, 10]
range(10,5) // [10, 9, 8, 7, 6, 5]
range(10,2,2) // [10, 8, 6, 4, 2]
range(5,10,0,-1) // [6, 7, 8, 9] not 5,10 themselves
range(5,10,0,1) // [4, 5, 6, 7, 8, 9, 10, 11]
range(5,10,0,-2) // [7, 8]
range(10,0,2,2) // [12, 10, 8, 6, 4, 2, 0, -2]
Ich hoffe, Sie finden es nützlich.
Und so funktioniert es.
Grundsätzlich berechne ich zuerst die Länge des resultierenden Arrays und erstelle ein mit Null gefülltes Array auf diese Länge und fülle es dann mit den erforderlichen Werten
(step || 1)
=> Und andere wie dieses bedeuten, verwenden Sie den Wert vonstep
und wenn es nicht bereitgestellt wurde, verwenden Sie1
stattdessen(Math.abs(end - start) + ((offset || 0) * 2)) / (step || 1) + 1)
, um es einfacher auszudrücken (Differenz * Versatz in beide Richtungen / Schritte).new Array(length).fill(0);
[0,0,0,..]
mit der gewünschten Länge. Wir ordnen es zu und geben ein neues Array mit den Werten zurück, die wir benötigenArray.map(function() {})
var direction = start < end ? 1 : 0;
Wennstart
es nicht kleiner als das istend
, müssen wir uns natürlich rückwärts bewegen. Ich meine von 0 auf 5 oder umgekehrtstartingPoint
+stepSize
*index
den Wert, den wir brauchenquelle
quelle
_
ist nur ein Name des Arguments im Mapping-Rückruf. Sie wissen, in einigen Sprachen würden Sie das_
als Namen verwenden, um darauf hinzuweisen, dass die Variable nicht verwendet wird._
wird jedoch nicht durch die Argumente an weitergegebenrange
. Warum nicht?Verwenden der Harmony Spread Operator- und Pfeilfunktionen:
Beispiel:
quelle
--- UPDATE (Danke an @lokhmakov für die Vereinfachung) ---
Eine andere Version mit ES6-Generatoren (siehe die großartige Antwort von Paolo Moretti mit ES6-Generatoren ):
Oder wenn wir nur iterable brauchen, dann:
--- ORGINAL Code war: ---
und
quelle
const range = (x, y) => Array.from(function* () { while (x <= y) yield x++; }())
Ich habe einige Untersuchungen zu verschiedenen Bereichsfunktionen durchgeführt. Testen Sie den jsperf-Vergleich der verschiedenen Möglichkeiten, diese Funktionen auszuführen . Sicher keine perfekte oder vollständige Liste, sollte aber helfen :)
Der Gewinner ist...
Technisch gesehen ist es nicht das schnellste auf Firefox, aber der verrückte Geschwindigkeitsunterschied (imho) auf Chrom macht das wieder wett.
Interessant ist auch, wie viel schneller Chrom mit diesen Array-Funktionen ist als Firefox. Chrome ist mindestens vier- oder fünfmal schneller .
quelle
Das Standard-Javascript verfügt nicht über eine integrierte Funktion zum Generieren von Bereichen. Mehrere Javascript-Frameworks bieten Unterstützung für solche Funktionen, oder wie andere bereits betont haben, können Sie jederzeit Ihre eigenen rollen.
Wenn Sie dies noch einmal überprüfen möchten, ist die endgültige Ressource der ECMA-262-Standard .
quelle
Sie können lodash oder Undescore.js verwenden
range
:Wenn Sie nur einen aufeinanderfolgenden Bereich von Ganzzahlen benötigen, können Sie alternativ Folgendes tun:
In ES6
range
kann mit Generatoren implementiert werden :Diese Implementierung spart Speicher beim Iterieren großer Sequenzen, da nicht alle Werte in einem Array materialisiert werden müssen:
quelle
Array.from
, um Generatoren in Array-Instanzen zu konvertieren und die Ausgabe zu überprüfen.Eine interessante Herausforderung wäre es, die kürzeste Funktion dafür zu schreiben . Rückfall zur Rettung!
Neigt dazu, auf großen Entfernungen langsam zu sein, aber zum Glück sind Quantencomputer gleich um die Ecke.
Ein zusätzlicher Bonus ist, dass es verschleiert. Weil wir alle wissen, wie wichtig es ist, unseren Code vor neugierigen Blicken zu verbergen.
Gehen Sie folgendermaßen vor, um die Funktion wirklich und vollständig zu verschleiern:
quelle
const range = (a, b) => (a>=b) ? [] : [a, ...range(a+1, b)]
mit ES6-Syntaxconst range = (a, b, Δ = 1) => (a > b) ? [] : [a, ...range(a + Δ, b, Δ)];
. Stimmen Sie auch die gesamte Antwort für den Kommentar ab.Dies ist möglicherweise nicht der beste Weg. Wenn Sie jedoch eine Reihe von Zahlen in einer einzigen Codezeile suchen. Zum Beispiel 10 - 50
Wobei 40 ist (Ende - Start) und 10 der Anfang ist. Dies sollte [10, 11, ..., 50] zurückgeben.
quelle
Ich würde so etwas codieren:
Es verhält sich ähnlich wie der Python-Bereich:
quelle
Eine eher minimalistische Implementierung, die stark ES6 verwendet, kann wie folgt erstellt werden, wobei besondere Aufmerksamkeit auf die
Array.from()
statische Methode gelenkt wird:quelle
getRange()
Funktion erstellt habe. Insbesondere wollte ich Randfälle erfassen, die in der obigen Bare-Bones-Variante möglicherweise nicht behandelt wurden. Zusätzlich habe ich Unterstützung für alphanumerische Bereiche hinzugefügt. Mit anderen Worten, wenn Sie es mit zwei bereitgestellten Eingaben wie'C'
und'K'
(in dieser Reihenfolge) aufrufen , wird ein Array zurückgegeben, dessen Werte der sequentielle Zeichensatz vom Buchstaben 'C' (einschließlich) bis zum Buchstaben 'K' (exklusiv) sind:getRange('C', 'K'); // => ["C", "D", "E", "F", "G", "H", "I", "J"]
new
Schlüsselwort nichtrange(start,end,step)
: Mit ES6-IteratorenSie fragen nur nach einer Ober- und Untergrenze. Hier erstellen wir auch eine mit einem Schritt.
Sie können einfach eine
range()
Generatorfunktion erstellen , die als Iterator fungieren kann. Dies bedeutet, dass Sie nicht das gesamte Array vorgenerieren müssen.Jetzt möchten Sie möglicherweise etwas erstellen, das das Array aus dem Iterator vorgeneriert und eine Liste zurückgibt. Dies ist nützlich für Funktionen, die ein Array akzeptieren. Dafür können wir verwenden
Array.from()
Jetzt können Sie ganz einfach ein statisches Array generieren.
Wenn jedoch ein Iterator gewünscht wird (oder Sie die Möglichkeit haben, einen Iterator zu verwenden), können Sie auch einfach einen erstellen.
Besondere Hinweise
R.range
ebenso wie Lodashquelle
Dies ist zwar nicht von PHP , sondern eine Nachahmung
range
von Python .quelle
Um ein numerisches Array für einen bestimmten Bereich zu generieren, verwende ich Folgendes:
Offensichtlich funktioniert es nicht für alphabetische Arrays.
quelle
array = []
innerhalb der Schleife gibt Ihnen möglicherweise nicht das, was Sie wollen.[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
, ich würde nur die erste Hälfte dieses Arrays erwarten.Verwenden von Harmony-Generatoren , die von allen Browsern außer IE11 unterstützt werden :
Beispiele
nehmen
Beispiel 1.
take
braucht nur so viel wie es nur gehttake(10, range( {from: 100, step: 5, to: 120} ) )
kehrt zurück
[100, 105, 110, 115, 120]
Beispiel 2.
to
nicht notwendigtake(10, range( {from: 100, step: 5} ) )
kehrt zurück
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
Nimm alles
Beispiel 3.
from
nicht notwendigtakeAll( range( {to: 5} ) )
kehrt zurück
[0, 1, 2, 3, 4, 5]
Beispiel 4.
takeAll( range( {to: 500, step: 100} ) )
kehrt zurück
[0, 100, 200, 300, 400, 500]
Beispiel 5.
takeAll( range( {from: 'z', to: 'a'} ) )
kehrt zurück
["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a"]
quelle
for
Klausel die Lesbarkeit hier verbessern.... mehr Reichweite mit einer Generatorfunktion.
Hoffe das ist nützlich.
quelle
Mein Codegolf-Mitarbeiter hat sich das ausgedacht (ES6), einschließlich:
nicht inklusive:
quelle
Sie können die
lodash
Funktion_.range(10)
https://lodash.com/docs#range verwendenquelle
d3 hat auch eine eingebaute Bereichsfunktion. Siehe https://github.com/mbostock/d3/wiki/Arrays#d3_range :
Beispiel:
quelle
Schließen Sie die ES6-Implementierung mit der Signatur des Bereichs ([Start,] Stopp [, Schritt]) ab:
Wenn Sie ein automatisches negatives Steppen wünschen, fügen Sie hinzu
Oder minimalistischer:
Wenn Sie große Reichweiten haben, schauen Sie sich den Generatoransatz von Paolo Moretti an
quelle
!stop
durchtypeof stop === 'undefined'
, dann ersetzenint
durchMath.floor
und fügen Sie einen Scheck hinzuif (start > stop && step > 0)
(andernfalls wirdrange(-3, -10)
eine Ausnahme ausgelöst, anstatt etwas Vernünftiges zu tun (entweder das Zeichen des Schritts umdrehen oder zurückkehren[]
)). Ansonsten gut!Dafür gibt es ein npm-Modul bereich ("bereich" ist das deutsche Wort für "range"). Es verwendet moderne JavaScript-Iteratoren, sodass Sie es auf verschiedene Arten verwenden können, z.
Es unterstützt auch absteigende Bereiche (durch einfaches Austauschen von
min
undmax
) und andere Schritte als1
.Haftungsausschluss: Ich bin der Autor dieses Moduls. Bitte nehmen Sie meine Antwort mit einem Körnchen Salz.
quelle
Dieser funktioniert auch umgekehrt.
quelle