En Python, donde [2]
hay una lista, el siguiente código proporciona esta salida:
[2] * 5 # Outputs: [2,2,2,2,2]
¿Existe una manera fácil de hacer esto con una matriz en JavaScript?
Escribí la siguiente función para hacerlo, pero ¿hay algo más corto o mejor?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
javascript
arrays
repeat
Curious2learn
fuente
fuente
Respuestas:
Puedes hacerlo así:
Duplica la matriz en cada iteración, por lo que puede crear una matriz realmente grande con pocas iteraciones.
Nota: También puede mejorar mucho su función utilizando en
push
lugar deconcat
, yaconcat
que creará una nueva matriz en cada iteración. De esta manera (se muestra solo como un ejemplo de cómo puede trabajar con matrices):fuente
arr = new Array(len);
y luego asignarlas por índice en el ciclo, es decirarr[i] = value;
. De esa forma solo paga O (n) en lugar de tener que seguir reasignando la matriz a medida que crece. En general, siempre es mejor evitar el crecimiento de matrices agregando cuando sea posible. Si conoce el tamaño final, úselo.Array.from({length:5}).map(x => 2)
En ES6 usando matriz de relleno () método
fuente
Array(5).fill([1,2,3]).flat()
. Tenga en cuenta que flat () todavía es muy experimental y el soporte del navegador es deficiente.fill
se evalúa una vez, por lo queArray(9).fill(someMutable)
crea nueve referencias asomeMutable
en la matriz (la mutación de una muta 'a todas').fuente
Array(...Array(10)).map(() => 5)
con el operador de propagación o también conArray.from(Array(10)).map(() => 5)
Array.from({length: 10}, () => 5);
lenght = 10
sin propiedades enumerables..map
solo funciona en propiedades enumerables. El.apply
método toma esta matriz y la asigna a unarguments array
(un objeto similar a una matriz) para pasarla a laArray
función de constructor. La matriz de argumentos no puede ser escasa, por lo que las propiedades que faltan se configuranundefined
y se vuelven enumerables. Ahora podemos usar.map
como se pretendíapuedes probar:
Actualización (01/06/2018) :
Ahora puedes tener un conjunto de personajes que se repiten.
Nota: Consulte más información sobre el relleno (...) y de (...) para ver la compatibilidad y el soporte del navegador.
Actualización (05/11/2019) :
Otra forma, sin usar
fill
ofrom
, que funciona para cadenas de cualquier longitud:fuente
Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]
o crear una matriz con un valor creciente
Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]
fuente
Array.from({length:5}, i => 1)
=>i
esundefined
porque representa un valor vacíoArray.from({length:5}, (e, i)=>i)
=>e
esundefined
porque representa un valor vacío. Debería serArray.from({length:5}, v => 1)
yArray.from({length:5}, (v, i)=>i)
En lodash no es tan malo:
EDITAR : Aún mejor:
EDITAR : Aún mejor:
fuente
[c] * n
Se puede escribir como:entonces para
[2] * 5
fuente
También puede ampliar la funcionalidad de Array de esta manera:
Debo señalar que ampliar la funcionalidad de los objetos integrados puede causar problemas si está trabajando con bibliotecas de terceros. Siempre pon esto en tus decisiones.
fuente
fill
cada índice de la matriz, se referirá al mismo objeto, por lo que cambiar uno los cambiará a todos. Esto no es demasiado difícil de resolver si se convierte en un problema.if (!Array.prototype.fill) { }
En el Node.js REPL:
fuente
Array.from({length: 5}, x => 2);
árbitro. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.fromEn caso de que necesite repetir una matriz varias veces:
inspirado por esta respuesta
fuente
No hay manera más fácil. Necesita hacer un bucle e insertar elementos en la matriz.
fuente
push
mejor oconcat
mejor, en términos de eficiencia?Utiliza esta función:
O para una versión más compacta:
O para una versión con curry:
Puede usar esta función con una lista:
fuente
Si necesita repetir una matriz, use lo siguiente.
volverá
fuente
Otra frase:
fuente
Esta función crea una matriz de elementos (longitud) donde cada elemento es igual a (valor) siempre que (valor) sea un entero o una cadena de un entero. Cualquier número decimal será truncado. Si desea números decimales, reemplace "parseInt ( " con " parseFloat ( "
Ejemplos:
fuente
Tuve problemas con los métodos mencionados cuando uso una matriz como
Para obtener esto estoy usando:
fuente
cycle
.Descubrí esto hoy mientras intentaba hacer una matriz 2D sin usar bucles. En retrospectiva, unirse a una nueva matriz es ordenado; Intenté mapear una nueva matriz, que no funciona ya que el mapa omite los espacios vacíos.
El carácter "#" puede ser cualquier carácter único válido. El 5 sería una variable para la cantidad de elementos que desea. El 7 sería el valor con el que desea llenar su matriz.
El nuevo método de relleno es mejor, y cuando codifiqué esto no sabía que existía, ni sabía que repetir es6; Voy a escribir una publicación de blog sobre el uso de este truco en conjunto con reduce para hacer cosas geniales.
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
fuente
Prueba esto:
fuente
fuente
Si está utilizando un cinturón de utlidad como lodash / subrayado, puede hacerlo así :)
fuente
También se puede usar como una sola línea:
fuente
Mejorando la respuesta de Vivek , esto funciona para cadenas de cualquier longitud, para llenar una matriz de longitud n:
Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)
fuente
Necesitaba una forma de repetir / repetir una matriz (con n elementos) m veces.
Por ejemplo, distribuir una lista (de personas) a una semana / mes. Digamos que tengo 3 nombres, y quiero que se repitan en una semana:
fuente