Estoy haciendo un ejercicio de aprendizaje y estoy tratando de entender el siguiente código. Pensé que tenía un manejo de matrices y bucles, pero este me tiene muy confundido.
El siguiente código:
function zeroArray(m, n) { let newArray = []; let row = []; for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { row.push(0); } newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix);Devoluciones
[ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ]Sin embargo, hubiera esperado que volviera.
[ [ 0, 0, ], [ 0, 0, 0, 0, ], [ 0, 0, 0, 0, 0, 0 ] ]Dado que en cada ciclo i, estamos presionando (0) a la fila [] dos veces, antes de presionar la fila [] en newArray.
Sin embargo, esto no está sucediendo, y en mi depurador VSCode parece que en cada ciclo i, cada índice existente de newArray se actualiza con la última versión de la matriz fila[].
¿Por qué es esto?
Debe hacer una copia de la matriz cuando presione newArray :
function zeroArray(m, n) { let newArray = []; let row = []; for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { row.push(0); } newArray.push(row.slice()); } return newArray; } let matrix = zeroArray(3, 2); console.log(JSON.stringify(matrix));1) Comience el bucle exterior con i = 1 hasta i <= m , por lo que el número de bucles será m
for (let i = 1; i <= m; i++) { 2) Debe crear una nueva row cada vez que comience el ciclo interno y empujar la row a newArray después de que finalice el ciclo interno
3) Establecer la condición del bucle interno como j < n * i
for (let j = 0; j < n * i; j++) { function zeroArray(m, n) { let newArray = []; // const row = [] // (-) for (let i = 1; i <= m; i++) { const row = []; // (+) for (let j = 0; j < n * i; j++) { // (+) row.push(0); } newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }La matriz m x n debe ser m filas y n columnas. Así que para 3, 2 esperas
[ [0, 0], [0, 0], [0, 0], ] Simplemente declare la row dentro del primer ciclo:
function zeroArray(m, n) { const newArray = []; for (let i = 0; i < m; i++) { const row = []; for (let j = 0; j < n; j++) { row.push(0); } newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix);