Estaba probando cosas en Vanilla JS y me encontré con un problema en el que array.push no empuja otra matriz (fila) cuyos elementos se cambiaron en un bucle for, sino que reemplaza toda la matriz (mainArr). Sería mejor mostrar el código, así que desplácese hacia abajo
function genArray(m, n) { let mainArr = []; let row = []; for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { row.push(j); } mainArr.push(row) } return mainArr; } let myArr = genArray(3, 2); console.log(myArr); /** * outputs: * * [ [ 0, 1, 0, 1, 0, 1 ], * [ 0, 1, 0, 1, 0, 1 ], * [ 0, 1, 0, 1, 0, 1 ] ] * * why not: * * [ [ 0, 1 ], * [ 0, 1, 0, 1 ], * [ 0, 1, 0, 1, 0, 1 ] ] */Al principio pensé que era solo por la referencia adjunta como dice esta respuesta SOF, pero como muestra el código, no es así.
let arr1 = [] let arr2 = [1, 2] arr1.push(arr2) console.log(arr1); // [ [ 1, 2 ] ] arr2 = [2, 4] console.log(arr1); // still [ [ 1, 2 ] ] let arr3 = [] let obj1 = {name: "John"} arr3.push(obj1) console.log(arr3); // [ {name: "John"}] obj1.name = "Mike" console.log(arr3); // [ {name: "Mike"} ]Puede usar la asignación de desestructuración en lugar de array.push. como esto:
function genArray(m, n) { let mainArr = []; let row = []; for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { row=[...row,j]; } mainArr.push(row) } return mainArr; } let myArr = genArray(3, 2); console.log(myArr);Está actualizando la misma matriz cada vez, por lo que todas las listas insertadas eventualmente apuntarán a la misma referencia con el valor establecido en la última iteración.
La siguiente es una solución con una mejora para alcanzar el resultado esperado:
function genArray(m, n) { const mainArr = []; for (let i = 0; i < m; i++) { const row = []; let count = i; while(count-- >= 0) { for (let j = 0; j < n; j++) { row.push(j); } } mainArr.push(row) } return mainArr; } console.log( genArray(3, 2) );