En PHP, puedes hacer ...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
Es decir, hay una función que le permite obtener un rango de números o caracteres al pasar los límites superior e inferior.
¿Hay algo incorporado en JavaScript de forma nativa para esto? Si no, ¿cómo lo implementaría?
$R
función, pero aparte de eso, realmente no lo creo.Array.from("ABC") //['A', 'B', 'C']
Esto es lo más cercano que puedo encontrar para la segunda parte de la pregunta.split("")
allíArray.apply(null, { length: 10 }).map(eval.call, Number)
Respuestas:
Números
Iteración de personajes
Iteración
Como funciones
Como funciones escritas
_.range()
función lodash.jsNavegadores antiguos que no son es6 sin una biblioteca:
(Crédito ES6 a nils petersohn y otros comentaristas)
fuente
(new Array(5)).map(function (value, index) { return index; })
no funcionaría? Esto vuelve[undefined × 5]
para mí en Chrome DevTools.map()
uno de sus amigos.Array(5).fill()
también es mapeablePara los números, puede usar ES6
Array.from()
, que funciona en todo en estos días excepto IE:Versión más corta:
Versión más larga:
que crea una matriz de 0 a 19 inclusive. Esto se puede acortar aún más a una de estas formas:
Los límites inferior y superior también se pueden especificar, por ejemplo:
Un artículo que describe esto con más detalle: http://www.2ality.com/2014/05/es6-array-methods.html
fuente
Array.from()
método, y más rápido que ambos:Array(20).fill().map((_, i) => i)
Array.from({length: end - start}, (v, k) => k + start)
undefined
, por lo quefill()
(sin argumento) no es incorrecto per se. El valor de relleno no se usa en esa solución, por lo que si lo desea, puede usarfill(0)
para guardar algunos caracteres.Mi nueva forma favorita ( ES2015 )
Y si necesita una función con un
step
parámetro:fuente
stop
en realidad no es la posición de parada / final sino la cuenta / distancia. (sin ofender, solo para que la gente se dé cuenta del error tipográfico)Array(Math.ceil((stop - start) / step) + 1)
, necesita+1
al final, imitar realmente el comportamiento "inclusivo" de php.range
método. Todos los demás que actualmente están por encima de esto (excepto lodash_.range
) implementan iteradores básicos en lugar de una función de rango real con inicio, parada y pasoAquí están mis 2 centavos:
fuente
Funciona para caracteres y números, avanzando o retrocediendo con un paso opcional.
jsFiddle .
Si lo suyo es aumentar los tipos nativos, asígnelo
Array.range
.Mostrar fragmento de código
fuente
Función de rango simple:
Para incorporar el tipo de datos BitInt, se puede incluir alguna verificación, asegurando que todas las variables sean iguales
typeof start
:Para eliminar valores superiores a los definidos por
stop
ejemplorange(0,5,2)
, incluirá6
, que no debería ser.fuente
step != 1
, lawhile
condición debe tenerstep
en cuenta. Mi versión actualizada con unstep
valor predeterminado : rango de funciones (inicio, parada, paso) {paso = paso || 1 var a = [inicio], b = inicio; while ((b + step) <stop) {console.log ("b:" + b + ". a:" + a + "."); b + = paso; a.push (b); } devolver a; }(step || 1)
.fuente
Array
prototipo.undefined method toUpperCase to etc
:!OK, en JavaScript no tenemos una
range()
función como PHP , por lo que necesitamos crear la función, lo cual es bastante fácil, escribo un par de funciones de una línea para usted y las separo para Números y Alfabetos de la siguiente manera:para los números :
y lo llaman así:
para alfabetos :
y lo llaman así:
fuente
Array(end - start + 1)
, yArray(end.charCodeAt(0) - start.charCodeAt(0) + 1)
.Función práctica para hacer el truco, ejecuta el fragmento de código a continuación
aquí es cómo usarlo
rango (inicio, fin, paso = 1, desplazamiento = 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]
Esperamos que te sea útil.
Y así es como funciona.
Básicamente, primero estoy calculando la longitud de la matriz resultante y creo una matriz llena de cero a esa longitud, luego la lleno con los valores necesarios
(step || 1)
=> Y otros como este medio utilizan el valor destep
y si no se proporciona el uso1
en vez(Math.abs(end - start) + ((offset || 0) * 2)) / (step || 1) + 1)
para simplificarla (diferencia * desplazamiento en ambas direcciones / pasos)new Array(length).fill(0);
marcar aquí[0,0,0,..]
a la longitud que queremos. Lo mapeamos y devolvemos una nueva matriz con los valores que necesitamos usandoArray.map(function() {})
var direction = start < end ? 1 : 0;
Obviamente sistart
no es más pequeño que elend
necesitamos retroceder. Me refiero a ir de 0 a 5 o viceversastartingPoint
+stepSize
*index
nos dará el valor que necesitamosfuente
fuente
_
es solo un nombre de argumento en la devolución de llamada de mapeo. Ya sabes, en algunos idiomas usarías_
como un nombre para señalar que la variable no se usa._
no se pasa por los argumentos arange
. Por qué no?Usando el operador de expansión Harmony y las funciones de flecha:
Ejemplo:
fuente
--- ACTUALIZACIÓN (Gracias a @lokhmakov por la simplificación) ---
Otra versión que usa generadores ES6 (vea la excelente respuesta de Paolo Moretti con generadores ES6 ):
O, si solo necesitamos iterables, entonces:
--- El código ORIGINAL fue: ---
y
fuente
const range = (x, y) => Array.from(function* () { while (x <= y) yield x++; }())
Investigué un poco sobre algunas funciones de rango. Consulte la comparación jsperf de las diferentes formas de realizar estas funciones. Ciertamente no es una lista perfecta o exhaustiva, pero debería ayudar :)
El ganador es...
Técnicamente no es el más rápido en Firefox, pero la diferencia de velocidad loca (IMHO) en Chrome lo compensa.
También es interesante observar cuánto más rápido es Chrome con estas funciones de matriz que Firefox. Chrome es al menos 4 o 5 veces más rápido .
fuente
El Javascript estándar no tiene una función incorporada para generar rangos. Varios marcos de JavaScript agregan soporte para tales características, o como otros han señalado, siempre puede implementar el suyo.
Si desea verificar dos veces, el recurso definitivo es el estándar ECMA-262 .
fuente
Puede usar lodash o Undescore.js
range
:Alternativamente, si solo necesita un rango consecutivo de enteros, puede hacer algo como:
En ES6
range
se puede implementar con generadores :Esta implementación ahorra memoria al iterar secuencias grandes, porque no tiene que materializar todos los valores en una matriz:
fuente
Array.from
para convertir generadores a instancias de matriz e inspeccionar la salida.Un desafío interesante sería escribir la función más corta para hacer esto. ¡Recursión al rescate!
Tiende a ser lento en grandes rangos, pero afortunadamente las computadoras cuánticas están a la vuelta de la esquina.
Una ventaja adicional es que es ofuscatorio. Porque todos sabemos lo importante que es ocultar nuestro código de miradas indiscretas.
Para ofuscar verdadera y completamente la función, haga esto:
fuente
const range = (a, b) => (a>=b) ? [] : [a, ...range(a+1, b)]
usando la sintaxis ES6const range = (a, b, Δ = 1) => (a > b) ? [] : [a, ...range(a + Δ, b, Δ)];
. También votando la respuesta completa por el comentario.Esta puede no ser la mejor manera. Pero si está buscando obtener un rango de números en una sola línea de código. Por ejemplo 10 - 50
Donde 40 es (fin - inicio) y 10 es el comienzo. Esto debería devolver [10, 11, ..., 50]
fuente
Codificaría algo como esto:
Se comporta de manera similar al rango de Python:
fuente
Una implementación bastante minimalista que emplea ES6 en gran medida se puede crear de la siguiente manera, llamando especialmente la atención sobre el
Array.from()
método estático:fuente
getRange()
especie de función "mejorada" . En particular, pretendía capturar casos extremos que podrían no ser abordados en la variante básica de arriba. Además, agregué soporte para rangos alfanuméricos. En otras palabras, llamarlo con dos entradas proporcionadas como'C'
y'K'
(en ese orden) devuelve una matriz cuyos valores son el conjunto secuencial de caracteres desde la letra 'C' (inclusive) hasta la letra 'K' (exclusiva):getRange('C', 'K'); // => ["C", "D", "E", "F", "G", "H", "I", "J"]
new
palabra claverange(start,end,step)
: Con iteradores ES6Solo solicita un límite superior e inferior. Aquí creamos uno con un paso también.
Puede crear fácilmente la
range()
función de generador que puede funcionar como un iterador. Esto significa que no tiene que generar previamente toda la matriz.Ahora es posible que desee crear algo que genere previamente la matriz desde el iterador y devuelva una lista. Esto es útil para funciones que aceptan una matriz. Para esto podemos usar
Array.from()
Ahora puede generar una matriz estática fácilmente,
Pero cuando algo desea un iterador (o le da la opción de usar un iterador), también puede crear uno fácilmente.
Notas especiales
R.range
igual que Lodashfuente
Aunque esto no es de PHP , pero una imitación de la
range
de Python .fuente
En cuanto a generar una matriz numérica para un rango dado, uso esto:
Obviamente, no funcionará para matrices alfabéticas.
fuente
array = []
dentro del bucle puede no darle lo que desea.[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
, esperaría solo la primera mitad de esa matriz.Uso de generadores Harmony , compatibles con todos los navegadores, excepto IE11 :
Ejemplos
tomar
Ejemplo 1.
take
solo toma la mayor cantidad posibletake(10, range( {from: 100, step: 5, to: 120} ) )
devoluciones
[100, 105, 110, 115, 120]
Ejemplo 2
to
no necesariotake(10, range( {from: 100, step: 5} ) )
devoluciones
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
tomalo todo
Ejemplo 3
from
no necesariotakeAll( range( {to: 5} ) )
devoluciones
[0, 1, 2, 3, 4, 5]
Ejemplo 4
takeAll( range( {to: 500, step: 100} ) )
devoluciones
[0, 100, 200, 300, 400, 500]
Ejemplo 5
takeAll( range( {from: 'z', to: 'a'} ) )
devoluciones
["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"]
fuente
for
cláusula mejoraría la legibilidad aquí.... más rango, usando una función de generador.
Espero que esto sea útil.
fuente
A mi compañero de codegolfing se le ocurrió esto (ES6), incluido:
no inclusivo:
fuente
puedes usar la
lodash
función_.range(10)
https://lodash.com/docs#rangefuente
d3 también tiene una función de rango incorporada. Ver https://github.com/mbostock/d3/wiki/Arrays#d3_range :
Ejemplo:
fuente
Complete la implementación de ES6 usando la firma de rango ([inicio,] parada [, paso]):
Si desea pasos negativos automáticos, agregue
O más minimalistamente:
Si tienes grandes rangos, mira el enfoque del generador de Paolo Moretti
fuente
!stop
contypeof stop === 'undefined'
, luego reemplaceint
conMath.floor
y agregue un chequeif (start > stop && step > 0)
(de lo contrario,range(-3, -10)
arroja una excepción en lugar de hacer algo cuerdo (ya sea voltear el signo de paso o regresar[]
)). De lo contrario, bien!Hay un módulo npm bereich para eso ("bereich" es la palabra alemana para "rango"). Utiliza los iteradores modernos de JavaScript, por lo que puede usarlo de varias maneras, como:
También admite rangos descendentes (simplemente intercambiando
min
ymax
), y también admite pasos distintos a1
.Descargo de responsabilidad: soy el autor de este módulo, así que tome mi respuesta con un grano de sal.
fuente
Este también funciona a la inversa.
fuente