¿Convertir una matriz de 9x9 en una matriz de 9 (3x3) en javascript? He escrito el código, pero no está empujando los 3x3 en una matriz separada. quiero 9 arreglos de 3x3
let array = [ [1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 1, 5, 6, 4, 8, 9, 7], [3, 1, 2, 6, 4, 5, 9, 7, 8], [4, 5, 6, 7, 8, 9, 1, 2, 3], [5, 6, 4, 8, 9, 7, 2, 3, 1], [6, 4, 5, 9, 7, 8, 3, 1, 2], [7, 8, 9, 1, 2, 3, 4, 5, 6], [8, 9, 7, 2, 3, 1, 5, 6, 4], [9, 7, 8, 3, 1, 2, 6, 4, 5] ]; let final=[]; let row = [0,1,2]; let col = [0,1,2]; let counter = 0; for ( let i = 0 ; i <= array.length - 1 ; i += 3 ) { for(let j = 0 ; j <= array.length - 1 ; j += 3 ) { final.push([]); row.forEach( ele1 => { final[counter].push([]) col.forEach( ele2 => { final[counter][ele1].push(array[ele1+i][ele2+j]); }) }) counter+=1; } } console.log(final)Puede recorrer la matriz utilizando la función de mapa y verificar que los valores del índice se dividan en matrices según sea necesario.
let myArr =[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 1, 5, 6, 4, 8, 9, 7], [3, 1, 2, 6, 4, 5, 9, 7, 8], [4, 5, 6, 7, 8, 9, 1, 2, 3], [5, 6, 4, 8, 9, 7, 2, 3, 1], [6, 4, 5, 9, 7, 8, 3, 1, 2], [7, 8, 9, 1, 2, 3, 4, 5, 6], [8, 9, 7, 2, 3, 1, 5, 6, 4], [9, 7, 8, 3, 1, 2, 6, 4, 5]]; let newArr = convertTo3x3(myArr); console.log(newArr); function convertTo3x3(myArr){ let array3x3 = []; myArr.map((row, rIndex) => { let tempArr = []; let row3 = []; row.map((item, lIndex) => { // convert each row to 3x3 rows if(lIndex % 3 == 0){ // reset row3 for new 3x3 arr on every 1st item of 3x3 row3 = []; } row3.push(item); if(lIndex % 3 == 2){ // push 3x3 row to tempArr on every 3rd item of 3x3 tempArr.push(row3); } }); array3x3.push(tempArr); }); return array3x3; }Su código parece funcionar bien, pero si desea un código más javascript, que funcione peor, aquí lo tiene.
let array = [ [1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 1, 5, 6, 4, 8, 9, 7], [3, 1, 2, 6, 4, 5, 9, 7, 8], [4, 5, 6, 7, 8, 9, 1, 2, 3], [5, 6, 4, 8, 9, 7, 2, 3, 1], [6, 4, 5, 9, 7, 8, 3, 1, 2], [7, 8, 9, 1, 2, 3, 4, 5, 6], [8, 9, 7, 2, 3, 1, 5, 6, 4], [9, 7, 8, 3, 1, 2, 6, 4, 5], ]; let final = []; array .reduce((a, c) => { const chunk = (arr, n) => arr.length ? [arr.slice(0, n), ...chunk(arr.slice(n), n)] : []; return [...a, ...chunk(c, 3)]; }, []) .map((el, i) => { if (i % 3 == 0) { final = [...final, [el]]; } else { final[Math.floor(i / 3)] = [...final[Math.floor(i / 3)], el]; } }); console.log(final);Su código está tratando de hacer demasiado. Haz que sea difícil de entender.
Primero lo rompería. Escriba una función simple que sepa cómo tomar una matriz de matrices y devolver una selección rectangular arbitraria a partir de ella. Algo como esto, eso es fácil de probar:
/** * Snip a rectangular section of an array of arrays (ragged, 2D array). * The returned array-of-arrys will ALWAYS be the specified size, padded * with 'undefined' values to the specified size. * * @param {Object[][]} arr - An array of arrays (ragged 2D array) * @param {number} row - Origin row: {row,col} denotes the upper-left corner of the rectangle to snip * @param {number} col - Origin column: {row,col} denotes the upper-left corner of the rectangle to snip * @param {number} nrows - Number of rows to snip * @param {number} ncols - Nunber of columns to snip * * @returns {Object[][]} */ function snip(arr, row, col, nrows, ncols ) { const selection = []; for ( let r = row, i = 0 ; r < row+nrows ; ++r, ++i ) { selection[i] = []; const tmp = arr[r] ?? []; for ( let c = col, j = 0 ; c < col+ncols ; ++c, ++j ) { selection[i][j] = tmp[c]; } } return selection; }Una vez que tenga eso, es fácil dividir su matriz de matrices más grande en matrices de 3x3.
Este código comienza en la esquina superior izquierda o en su matriz de 9x9 y devuelve una lista plana que contiene 9 matrices separadas de 3x3, recortadas de izquierda a derecha y de arriba a abajo:
final = []; for ( let x = 0 ; x < 9; x += 3 ) { for ( let y = 0 ; y < 9 ; y += 3 ) { // (x,y) denotes the top left corner of the desired sub-array final.push( snip(arr, x,y, 3,3 ) ); } }Lo bueno de este enfoque es que es fácil de probar y . . . es flexible Puede manejar una matriz de origen de cualquier tamaño y puede dividirla en subarreglos de cualquier tamaño y en cualquier orden, lo que crea conveniente.