objetos - recorrer objeto javascript
Repita una matriz con múltiples elementos varias veces en JavaScript (7)
En JavaScript, ¿cómo puedo repetir una matriz que contiene varios elementos, de manera concisa?
En Ruby, podrías hacer
irb(main):001:0> ["a", "b", "c"] * 3
=> ["a", "b", "c", "a", "b", "c", "a", "b", "c"]
Busqué en la biblioteca de lodash y no encontré nada que fuera directamente aplicable. Solicitud de características: repetir matrices. es una solicitud de función para agregarla a lodash, y la mejor solución dado que existe
const arrayToRepeat = [1, 2, 3];
const numberOfRepeats = 3;
const repeatedArray = _.flatten(_.times(numberOfRepeats, _.constant(arrayToRepeat)));
Las preguntas ¿ La forma más eficiente de crear una matriz de JavaScript rellena con cero? y Crear una matriz con el mismo elemento que se repite varias veces, centrándose en repetir solo un elemento varias veces, mientras que quiero repetir una matriz que tenga varios elementos.
Usar bibliotecas razonablemente bien mantenidas es aceptable.
Además de la [].concat
obvia [].concat
+ Array.from({length: 3}, …)
/ fill()
, el uso de generadores con código generará un código elegante:
function* concat(iterable) {
for (const x of iterable)
for (const y of x)
yield y;
}
function* repeat(n, x) {
while (n-- > 0)
yield x;
}
const repeatedArray = Array.from(concat(repeat(3, [1, 2, 3])));
También puedes acortarlo a
function* concatRepeat(n, x) {
while (n-- > 0)
yield* x;
}
const repeatedArray = Array.from(concatRepeat(3, [1, 2, 3]));
Alternativa recursiva:
const repeat = (a, n) => n-- ? a.concat(repeat(a, n)) : [];
console.log( repeat([1, 2], 3) )
Aunque otros métodos funcionan simplemente, estos también.
Array.fill()
y Array.from()
en métodos anteriores no funcionarán en IE
. MDN Docs para referencia
Mehtod 1 : Loop y push ( Array.prototype.push ) lo mismo en la matriz.
function mutateArray(arr,n)
{
var temp = [];
while(n--) Array.prototype.push.apply(temp,arr);
return temp;
}
var a = [1,2,3,4,5];
console.log(mutateArray(a,3));
Método 2 : une los elementos de la matriz y String.repeat() para mutar la cadena y devolver la cadena dividida.
Nota : el método de repeat
aún no es compatible con Android webviews
IE
y Android webviews
.
function mutateArray(arr,n)
{
var arr = (arr.join("$")+"$").repeat(n).split("$");
arr.pop(); //To remove the last empty element
return arr;
}
var a = [1,2,3,4,5];
console.log(mutateArray(a,3));
Desafortunadamente, no es posible de forma nativa en JS (tampoco es posible la sobrecarga del operador, por lo que no podemos usar algo como Array.prototype.__mul__
), pero podemos crear un Array con la longitud objetivo adecuada, rellenar con marcadores de posición y luego volver a mapear los valores:
const seqFill = (filler, multiplier) =>
Array(filler.length * multiplier)
.fill(1)
.map(
(_, i) => filler[i % filler.length]
);
console.log(seqFill([1,2,3], 3));
console.log(seqFill([''a'',''b'',''c'', ''d''], 5));
O de otra manera, conectándose al prototipo de Array, puede usar la sintaxis de Array#seqFill(multiplier)
, esta es probablemente la más cercana a la sintaxis de ruby (rb puede hacer básicamente todo con sobrecarga de operadores, pero JS no puede) :
Object.defineProperty(Array.prototype, ''seqFill'', {
enumerable: false,
value: function(multiplier) {
return Array(this.length * multiplier).fill(1).map((_, i) => this[i % this.length]);
}
});
console.log([1,2,3].seqFill(3));
Mi primera idea sería crear una función como esta.
let repeat = (array, numberOfTimes) => Array(numberOfTimes).fill(array).reduce((a, b) => [...a, ...b], [])
console.log(repeat(["a", "b", "c"], 3))
utilizando el método de fill y reduce
Lo ideal sería que, en lugar de usar Reducir, pudieras usar el flatten pero aún no hay soporte en los navegadores.
No necesita ninguna biblioteca, puede usar Array.from
para crear una matriz de arrays que quiera repetir, y luego aplanar usando [].concat
y diseminar:
const makeRepeated = (arr, repeats) =>
[].concat(...Array.from({ length: repeats }, () => arr));
console.log(makeRepeated([1, 2, 3], 2));
En los navegadores más nuevos, puede usar Array.prototype.flat
lugar de [].concat(...
:
const makeRepeated = (arr, repeats) =>
Array.from({ length: repeats }, () => arr).flat();
console.log(makeRepeated([1, 2, 3], 2));
Puede usar el constructor de Array
junto con su método de relleno para rellenarlo varias veces de la matriz que desea repetir y luego concat
(las subarrays) en una sola matriz:
const repeatedArray = [].concat(...Array(num).fill(arr));
Nota: En los navegadores más antiguos (pre-ES6), puede usar la Function#apply
para imitar la sintaxis restante (se llamará concat
con cada una de las matrices secundarias que se le pasan como argumento):
var repeatedArray = [].concat.apply([], Array(num).fill(arr));
Ejemplo:
const arrayToRepeat = [1, 2, 3];
const numberOfRepeats = 3;
const repeatedArray = [].concat(...Array(numberOfRepeats).fill(arrayToRepeat));
console.log(repeatedArray);