En PHP, vous pouvez faire ...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
Autrement dit, il existe une fonction qui vous permet d'obtenir une plage de chiffres ou de caractères en passant les limites supérieure et inférieure.
Y a-t-il quelque chose de natif intégré à JavaScript pour cela? Sinon, comment pourrais-je le mettre en œuvre?
$R
fonction, mais à part ça, je ne le pense pas vraiment.Array.from("ABC") //['A', 'B', 'C']
C'est la chose la plus proche que je puisse trouver pour la deuxième partie de la question.split("")
également y utiliserArray.apply(null, { length: 10 }).map(eval.call, Number)
Réponses:
Nombres
Itération de caractère
Itération
Comme fonctions
En tant que fonctions tapées
_.range()
Fonction lodash.jsAnciens navigateurs non es6 sans bibliothèque:
(Crédit ES6 à Nils Petersohn et à d'autres commentateurs)
la source
(new Array(5)).map(function (value, index) { return index; })
ne fonctionnerait pas? Cela revient[undefined × 5]
pour moi dans Chrome DevTools.map()
ou l'un de ses amis.Array(5).fill()
est également mappablePour les nombres, vous pouvez utiliser ES6
Array.from()
, qui fonctionne dans tout, de nos jours, sauf IE:Version plus courte:
Version plus longue:
ce qui crée un tableau de 0 à 19 inclus. Cela peut être encore raccourci à l'une de ces formes:
Des limites inférieures et supérieures peuvent également être spécifiées, par exemple:
Un article décrivant cela plus en détail: http://www.2ality.com/2014/05/es6-array-methods.html
la source
Array.from()
méthode et plus rapide que les deux:Array(20).fill().map((_, i) => i)
Array.from({length: end - start}, (v, k) => k + start)
undefined
, doncfill()
(sans argument) n'est pas faux en soi. La valeur de remplissage n'est pas utilisée dans cette solution, donc si vous le souhaitez, vous pouvez utiliserfill(0)
pour enregistrer quelques caractères.Ma nouvelle forme préférée ( ES2015 )
Et si vous avez besoin d'une fonction avec un
step
paramètre:la source
stop
n'est pas réellement la position d'arrêt / fin mais le compte / la distance. (pas d'offense, juste pour sensibiliser les gens à la faute de frappe)Array(Math.ceil((stop - start) / step) + 1)
, a besoin+1
de la fin, pour vraiment imiter le comportement "inclusif" de php.range
méthode. Tous les autres actuellement au-dessus de cela (à l'exception de lodash_.range
) implémentent des itérateurs de base plutôt qu'une fonction de plage réelle avec démarrage, arrêt et étapeVoici mes 2 cents:
la source
Il fonctionne pour les caractères et les chiffres, en avant ou en arrière avec une étape facultative.
jsFiddle .
Si vous préférez augmenter les types natifs, affectez-le à
Array.range
.Afficher l'extrait de code
la source
Fonction de portée simple:
Pour incorporer le type de données BitInt, une vérification peut être incluse, garantissant que toutes les variables sont identiques
typeof start
:Pour supprimer des valeurs supérieures à celles définies par
stop
exemplerange(0,5,2)
, inclura6
, qui ne devrait pas l'être.la source
step != 1
lawhile
condition doit être prisestep
en compte. Ma version mise à jour avec unestep
valeur par défaut : plage de fonctions (démarrage, arrêt, étape) {étape = étape || 1 var a = [début], b = début; while ((étape b +) <stop) {console.log ("b:" + b + ". a:" + a + "."); b + = pas; a. pousser (b); } retourne un; }(step || 1)
.la source
Array
prototype.undefined method toUpperCase to etc
!OK, en JavaScript, nous n'avons pas de
range()
fonction comme PHP , nous devons donc créer la fonction qui est assez simple, j'écris quelques fonctions d'une ligne pour vous et je les sépare pour les nombres et les alphabets comme ci-dessous:pour les nombres :
et appelez-le comme:
pour les alphabets :
et appelez-le comme:
la source
Array(end - start + 1)
, etArray(end.charCodeAt(0) - start.charCodeAt(0) + 1)
.Handy fonction pour faire le tour, exécutez l'extrait de code ci - dessous
voici comment l'utiliser
plage (début, fin, étape = 1, décalage = 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]
j'espère que vous le trouverez utile.
Et voici comment cela fonctionne.
Fondamentalement, je calcule d'abord la longueur du tableau résultant et crée un tableau rempli de zéro à cette longueur, puis le remplit avec les valeurs nécessaires
(step || 1)
=> Et d'autres comme cela signifie utiliser la valeur destep
et si elle n'a pas été fournie, utiliser à la1
place(Math.abs(end - start) + ((offset || 0) * 2)) / (step || 1) + 1)
pour le simplifier (différence * décalage dans les deux sens / pas)new Array(length).fill(0);
vérification ici[0,0,0,..]
à la longueur souhaitée. Nous mappons dessus et retournons un nouveau tableau avec les valeurs dont nous avons besoin en utilisantArray.map(function() {})
var direction = start < end ? 1 : 0;
Évidemment, si cestart
n'est pas plus petit que le,end
nous devons reculer. Je veux dire passer de 0 à 5 ou vice versastartingPoint
+stepSize
*index
will nous donne la valeur dont nous avons besoinla source
la source
_
est juste un nom d'argument dans le rappel de mappage. Vous savez, dans certaines langues, vous utiliseriez le_
comme nom pour indiquer que la variable n'est pas utilisée._
ne passe pas les arguments àrange
. Pourquoi pas?Utilisation des fonctions d' opérateur et de flèche Harmony :
Exemple:
la source
--- MISE À JOUR (Merci à @lokhmakov pour la simplification) ---
Une autre version utilisant des générateurs ES6 (voir la bonne réponse de Paolo Moretti avec les générateurs ES6 ):
Ou, si nous avons seulement besoin d'itérable, alors:
--- Le code ORGINAL était: ---
et
la source
const range = (x, y) => Array.from(function* () { while (x <= y) yield x++; }())
A fait des recherches sur différentes fonctions de plage. Découvrez la comparaison jsperf des différentes façons de faire ces fonctions. Certainement pas une liste parfaite ou exhaustive, mais devrait aider :)
Le gagnant est...
Techniquement, ce n'est pas le plus rapide sur Firefox, mais une différence de vitesse folle (à mon humble avis) sur Chrome le compense.
Une observation également intéressante est à quel point le chrome est plus rapide avec ces fonctions de tableau que Firefox. Chrome est au moins 4 ou 5 fois plus rapide .
la source
Le Javascript standard n'a pas de fonction intégrée pour générer des plages. Plusieurs frameworks javascript ajoutent la prise en charge de telles fonctionnalités, ou comme d'autres l'ont souligné, vous pouvez toujours lancer la vôtre.
Si vous souhaitez revérifier, la ressource définitive est la norme ECMA-262 .
la source
Vous pouvez utiliser lodash ou Undescore.js
range
:Alternativement, si vous n'avez besoin que d'une plage consécutive d'entiers, vous pouvez faire quelque chose comme:
Dans ES6
range
peut être implémenté avec des générateurs :Cette implémentation économise de la mémoire lors de l'itération de grandes séquences, car elle n'a pas à matérialiser toutes les valeurs dans un tableau:
la source
Array.from
pour convertir des générateurs en instances de tableau et inspecter la sortie.Un défi intéressant serait d'écrire la fonction la plus courte pour ce faire. Récursivité à la rescousse!
A tendance à être lent sur de grandes plages, mais heureusement, les ordinateurs quantiques sont juste autour du coin.
Un bonus supplémentaire est qu'il est obscur. Parce que nous savons tous combien il est important de cacher notre code aux regards indiscrets.
Pour vraiment et complètement obscurcir la fonction, procédez comme suit:
la source
const range = (a, b) => (a>=b) ? [] : [a, ...range(a+1, b)]
:, en utilisant la syntaxeconst range = (a, b, Δ = 1) => (a > b) ? [] : [a, ...range(a + Δ, b, Δ)];
. Également en votant la réponse entière pour le commentaire.Ce n'est peut-être pas la meilleure façon. Mais si vous cherchez à obtenir une plage de chiffres sur une seule ligne de code. Par exemple 10 - 50
Où 40 est (fin - début) et 10 est le début. Cela devrait retourner [10, 11, ..., 50]
la source
Je coderais quelque chose comme ceci:
Il se comporte de manière similaire à la gamme Python:
la source
Une implémentation plutôt minimaliste qui utilise fortement ES6 peut être créée comme suit, en attirant une attention particulière sur la
Array.from()
méthode statique:la source
getRange()
sorte de fonction "améliorée" . En particulier, je visais à capturer les cas marginaux qui pourraient ne pas être traités dans la variante à nu ci-dessus. De plus, j'ai ajouté la prise en charge des plages alphanumériques. En d'autres termes, l'appeler avec deux entrées fournies comme'C'
et'K'
(dans cet ordre) renvoie un tableau dont les valeurs sont l'ensemble séquentiel de caractères de la lettre 'C' (inclus) à la lettre 'K' (exclusif):getRange('C', 'K'); // => ["C", "D", "E", "F", "G", "H", "I", "J"]
new
mot clérange(start,end,step)
: Avec les itérateurs ES6Vous ne demandez que des limites supérieures et inférieures. Ici, nous en créons un avec une étape aussi.
Vous pouvez facilement créer une
range()
fonction de générateur qui peut fonctionner comme un itérateur. Cela signifie que vous n'avez pas à pré-générer l'intégralité du tableau.Vous pouvez maintenant créer quelque chose qui pré-génère le tableau à partir de l'itérateur et renvoie une liste. Ceci est utile pour les fonctions qui acceptent un tableau. Pour cela, nous pouvons utiliser
Array.from()
Vous pouvez maintenant générer facilement un tableau statique,
Mais lorsque quelque chose désire un itérateur (ou vous donne la possibilité d'utiliser un itérateur), vous pouvez facilement en créer un aussi.
Notes spéciales
R.range
comme Lodashla source
Bien que ce n'est pas de PHP , mais une imitation de
range
de Python .la source
En ce qui concerne la génération d'un tableau numérique pour une plage donnée, j'utilise ceci:
De toute évidence, cela ne fonctionnera pas pour les tableaux alphabétiques.
la source
array = []
à l'intérieur de la boucle peut ne pas vous donner ce que vous voulez.[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
, je ne m'attendrais qu'à la première moitié de ce tableau.Utilisation de générateurs Harmony , pris en charge par tous les navigateurs à l'exception d'IE11 :
Exemples
prendre
Exemple 1.
take
prend seulement autant que possibletake(10, range( {from: 100, step: 5, to: 120} ) )
Retour
[100, 105, 110, 115, 120]
Exemple 2.
to
pas nécessairetake(10, range( {from: 100, step: 5} ) )
Retour
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
prendre toutes
Exemple 3.
from
pas nécessairetakeAll( range( {to: 5} ) )
Retour
[0, 1, 2, 3, 4, 5]
Exemple 4.
takeAll( range( {to: 500, step: 100} ) )
Retour
[0, 100, 200, 300, 400, 500]
Exemple 5.
takeAll( range( {from: 'z', to: 'a'} ) )
Retour
["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"]
la source
for
clause améliorerait la lisibilité ici.... plus de portée grâce à une fonction générateur.
J'espère que c'est utile.
la source
Mon collègue de golf de code est venu avec ceci (ES6), inclus:
non inclus:
la source
vous pouvez utiliser la
lodash
fonction_.range(10)
https://lodash.com/docs#rangela source
d3 a également une fonction de gamme intégrée. Voir https://github.com/mbostock/d3/wiki/Arrays#d3_range :
Exemple:
la source
Implémentation complète d'ES6 en utilisant la signature de la plage ([start,] stop [, step]):
Si vous voulez un pas négatif automatique, ajoutez
Ou plus minimaliste:
Si vous avez d'énormes gammes, regardez l'approche du générateur de Paolo Moretti
la source
!stop
partypeof stop === 'undefined'
, puis remplacezint
parMath.floor
, et ajoutez une cocheif (start > stop && step > 0)
(sinon,range(-3, -10)
lève une exception au lieu de faire quelque chose de sain (soit retourner le signe de l'étape, soit revenir[]
)). Sinon, bon!Il y a un module npm bereich pour cela ("bereich" est le mot allemand pour "range"). Il utilise les itérateurs modernes de JavaScript, vous pouvez donc l'utiliser de différentes manières, telles que:
Il prend également en charge les plages décroissantes (en échangeant simplement
min
etmax
), et prend également en charge les étapes autres que1
.Avertissement: je suis l'auteur de ce module, veuillez donc prendre ma réponse avec un grain de sel.
la source
Celui-ci fonctionne également à l'envers.
la source