¿Siempre he encontrado la range
función que falta en JavaScript, ya que está disponible en Python y otros? ¿Existe alguna forma concisa de generar un rango de números en ES2015?
EDITAR: MI pregunta es diferente del duplicado mencionado, ya que es específico de ES2015 y no ECMASCRIPT-5. También necesito que el rango comience desde 0 y no un número de inicio específico (aunque sería bueno si eso estuviera allí)
javascript
arrays
ecmascript-6
Aditya Singh
fuente
fuente
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Respuestas:
Puede utilizar el operador de extensión en las claves de una matriz recién creada.
[...Array(n).keys()]
o
Array.from(Array(n).keys())
La
Array.from()
sintaxis es necesaria si se trabaja con TypeScriptfuente
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
no funciona en TypeScript? ¿Es una desviación intencional de otras implementaciones de JS?Array(5).keys().slice()
y el segmento no es un método de iterador de matriz. Aquí hay un ejemplo de que no funciona typecriptlang.org/play/…También encontré una forma más intuitiva de usar
Array.from
:Ahora esta
range
función devolverá todos los números comenzando desde 0 hasta n-1Una versión modificada de la gama para admitir
start
yend
es:EDITAR Como lo sugiere @ marco6, puede poner esto como un método estático si se adapta a su caso de uso
y usarlo como
fuente
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
Y luego en todas partesArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
. bocas?Con Delta
Para javascript
Para mecanografiado
Actualizar
Editar
fuente
Array.from(Array(~~((to - from) / step) + 1).keys())
Para números del 0 al 5
fuente
Muchas de estas soluciones se basan en la creación de instancias de objetos Array reales, que pueden hacer el trabajo en muchos casos, pero no admiten casos como
range(Infinity)
. Podría usar un generador simple para evitar estos problemas y admitir secuencias infinitas:Ejemplos:
fuente
Entonces, en este caso, sería bueno si el objeto Number se comportara como un objeto Array con el operador de propagación.
Por ejemplo, el objeto Array utilizado con el operador de propagación:
Funciona así porque el objeto Array tiene un iterador incorporado.
En nuestro caso, necesitamos que un objeto Number tenga una funcionalidad similar:
Para hacer eso, simplemente podemos crear un iterador numérico para ese propósito.
Ahora es posible crear rangos de 0 a N con el operador de propagación.
http://jsfiddle.net/01e4xdv5/4/
Salud.
fuente
Puede usar una función de generador, que crea el rango de manera perezosa solo cuando es necesario:
Puede utilizar una función de generador de orden superior para mapear el
range
generador:Si no tiene miedo, incluso puede generalizar el enfoque del generador para abordar un rango mucho más amplio (juego de palabras):
Tenga en cuenta que los generadores / iteradores son inherentemente con estado, es decir, hay un cambio de estado implícito con cada invocación de
next
. El estado es una bendición mixta.fuente
Rango con el paso ES6, que funciona de manera similar a Python
list(range(start, stop[, step]))
:Ejemplos:
fuente
Para apoyar delta
fuente
También puedes hacerlo con un trazador de líneas con soporte escalonado como este:
((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)
El resultado es
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.fuente
Esta función devolverá una secuencia entera.
fuente
en TypeScript
fuente
Array.from
y extender la sintaxis. Y luego es exactamente lo mismo que la respuesta existente.[...Array(n).keys()]
que no funciona en TypeScript.Array.from(Array(n).keys())
. Sin embargo, estoy bastante seguro de que debería funcionar, ¿a qué se transpila el literal con sintaxis extendida?Aquí hay otra variación que no se usa
Array
.fuente
Los generadores ahora le permiten generar la secuencia numérica de manera perezosa y usando menos memoria para rangos grandes.
Si bien la pregunta establece específicamente ES2015, espero que muchos usuarios de Typecript terminen aquí y la conversión a ES sea sencilla ...
Las dos primeras declaraciones de función son solo para proporcionar sugerencias de finalización más informativas en su IDE.
fuente
¿Qué tal simplemente mapear ...
Array (n) .map ((valor, índice) ....) es el 80% del camino. Pero por alguna extraña razón no funciona. Pero hay una solución.
Para una gama
Extraño, estos dos iteradores devuelven el mismo resultado:
Array(end-start+1).entries()
yArray(end-start+1).fill().entries()
fuente