J'ai toujours trouvé la range
fonction manquante dans JavaScript car elle est disponible en python et autres? Existe-t-il un moyen concis de générer une plage de nombres dans ES2015?
EDIT: Ma question est différente du duplicata mentionné car elle est spécifique à ES2015 et non à ECMASCRIPT-5. J'ai également besoin que la plage commence à 0 et non à un numéro de départ spécifique (bien que ce serait bien si c'était là)
javascript
arrays
ecmascript-6
Aditya Singh
la source
la source
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Réponses:
Vous pouvez utiliser l'opérateur de diffusion sur les clés d'un tableau fraîchement créé.
[...Array(n).keys()]
ou
Array.from(Array(n).keys())
La
Array.from()
syntaxe est nécessaire si vous travaillez avec TypeScriptla source
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
ne fonctionne pas dans Typescript? S'agit-il d'un écart intentionnel par rapport aux autres implémentations JS?Array(5).keys().slice()
et le slice n'est pas une méthode d'itérateur de tableau. Voici un exemple de cela ne fonctionne pas typescriptlang.org/play/…J'ai également trouvé un moyen plus intuitif d'utiliser
Array.from
:Maintenant, cette
range
fonction retournera tous les nombres de 0 à n-1Une version modifiée de la gamme à prendre en charge
start
etend
est:EDIT Comme suggéré par @ marco6, vous pouvez mettre cela comme une méthode statique si cela convient à votre cas d'utilisation
et utilisez-le comme
la source
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
Et puis partoutArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
. des thouths?Avec Delta
Pour javascript
Pour Typescript
Mettre à jour
Éditer
la source
Array.from(Array(~~((to - from) / step) + 1).keys())
Pour les nombres 0 à 5
la source
Un grand nombre de ces solutions reposent sur l'instanciation d'objets Array réels, ce qui peut faire le travail dans de nombreux cas, mais ne peut pas prendre en charge des cas comme
range(Infinity)
. Vous pouvez utiliser un simple générateur pour éviter ces problèmes et prendre en charge des séquences infinies:Exemples:
la source
Donc, dans ce cas, ce serait bien si l' objet Number se comporterait comme un objet Array avec l'opérateur de propagation.
Par exemple, un objet Array utilisé avec l'opérateur de diffusion:
Cela fonctionne comme ceci car l'objet Array a un itérateur intégré.
Dans notre cas, nous avons besoin d'un objet Number pour avoir une fonctionnalité similaire:
Pour ce faire, nous pouvons simplement créer un itérateur numérique à cet effet.
Il est maintenant possible de créer des plages de 0 à N avec l'opérateur d'étalement.
http://jsfiddle.net/01e4xdv5/4/
À votre santé.
la source
Vous pouvez utiliser une fonction de générateur, qui crée la plage paresseusement uniquement lorsque cela est nécessaire:
Vous pouvez utiliser une fonction de générateur d'ordre supérieur pour mapper sur le
range
générateur:Si vous n'avez pas peur, vous pouvez même généraliser l'approche du générateur pour aborder un éventail beaucoup plus large (jeu de mots):
Gardez à l'esprit que les générateurs / itérateurs sont intrinsèquement avec état, c'est-à-dire qu'il y a un changement d'état implicite à chaque invocation de
next
. L'État est une bénédiction mitigée.la source
Plage avec l'étape ES6, qui fonctionne de manière similaire à python
list(range(start, stop[, step]))
:Exemples:
la source
Pour prendre en charge delta
la source
Vous pouvez également le faire avec une doublure avec support de marche comme celui-ci:
((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)
Le résultat est
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.la source
Cette fonction renverra une séquence d'entiers.
la source
dans Typographie
la source
Array.from
et de diffuser la syntaxe. Et puis c'est exactement la même chose que la réponse existante.[...Array(n).keys()]
ne fonctionne pas dans Typescript.Array.from(Array(n).keys())
. Je suis à peu près sûr que cela devrait fonctionner, à quoi transite le littéral avec la syntaxe de propagation?Voici une autre variante qui n'utilise pas
Array
.la source
Les générateurs vous permettent désormais de générer la séquence de nombres paresseusement et en utilisant moins de mémoire pour les grandes plages.
Bien que la question mentionne spécifiquement ES2015, je m'attends à ce que beaucoup d'utilisateurs de Typescript se retrouvent ici et la conversion en ES est simple ...
Les deux premières déclarations de fonction sont juste pour fournir des suggestions de complétion plus informatives dans votre IDE.
la source
Que diriez-vous simplement de la cartographie ...
Array (n) .map ((value, index) ....) est à 80% du chemin. Mais pour une raison étrange, cela ne fonctionne pas. Mais il existe une solution de contournement.
Pour une gamme
Bizarre, ces deux itérateurs renvoient le même résultat:
Array(end-start+1).entries()
etArray(end-start+1).fill().entries()
la source