He luchado por entender la salida de este bucle anidado durante mucho tiempo. Realmente quiero entender lo que hace.
Espero que genere: [ [ 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ]
Pero la salida real es: [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ]
Después de que la primera row del bucle interno contenga dos 0 y debe insertarse en newArray en el bucle externo. Parece que esto no está sucediendo y no puedo entender por qué. El primer elemento debería ser [0, 0] , ¿verdad?.
¡Realmente espero que alguien pueda ver lo que quiero decir aquí y explicar lo que está sucediendo! ¡Gracias!
function zeroArray(m, n) { // Creates a 2-D array with m rows and n columns of zeroes let newArray = []; let row = []; for (let i = 0; i < m; i++) { // Adds the m-th row into newArray for (let j = 0; j < n; j++) { // Pushes n zeroes into the current row to create the columns row.push(0); } // Pushes the current row, which now has n zeroes in it, to the array newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix);Estás pasando la row a todas las iteraciones del bucle. Para lograr lo que desea, la fila debe ser única en cada iteración del ciclo, por lo que debe moverla dentro del primer ciclo.
Para comprender mejor el problema, lea más sobre valores y referencias en JavaScript: https://www.javascripttutorial.net/javascript-pass-by-value/#:~:text=JavaScript%20pass%2Dby%2Dvalue%20or% 20pass%2Dby%2Dreference&text=Esto%20significa%20que%20JavaScript%20copia,variables%20fuera%20de%20la%20función .
function zeroArray(m, n) { // Creates a 2-D array with m rows and n columns of zeroes let newArray = []; for (let i = 0; i < m; i++) { let row = []; // Adds the m-th row into newArray for (let j = 0; j < n; j++) { // Pushes n zeroes into the current row to create the columns row.push(0); } // Pushes the current row, which now has n zeroes in it, to the array newArray.push(row); // Update n to get desired pattern n += 2 } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix);Esto se debe a que los objetos JavaScript (y las matrices) son solo una referencia en la memoria. por lo que está creando una sola matriz de matrices que comparten la misma dirección en la memoria, porque comparten la misma dirección, cuando la actualiza (Array.prototype.push), las está actualizando todas. La solución es crear una nueva fila en el primer bucle:
function zeroArray(m, n) { const newArray = []; for (let i = 0; i < m; i++) { // If this isn't the first run, take the last value of row const prevRow = i > 0 ? newArray[i-1] : []; const row = [...prevRow]; // By using the spread operator(...), you can copy an array for (let j = 0; j < n; j++) { // Pushes n zeroes into the current row to create the columns row.push(0); } // Pushes the current row, which now has n zeroes in it, to the array newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log(matrix);Esta no es una forma natural de escribir JavaScript, puede lograr lo mismo con:
const zeroArray = (m, n) => Array.from({ length : m }).map((value, index) => { return Array.from({ length : (index + 1) * n }).map(() => 0); });