Como converter matriz simples em matriz bidimensional (matriz) em javascript (ou jquery)

Imagine que eu tenha uma matriz

A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) 

E eu quero converter em matriz bidimensional (matriz de N x M), por exemplo, assim:

 A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9)) 

Observe que as linhas e colunas da matriz podem ser alteradas.

Algo assim?

 function listToMatrix(list, elementsPerSubArray) { var matrix = [], i, k; for (i = 0, k = -1; i < list.length; i++) { if (i % elementsPerSubArray === 0) { k++; matrix[k] = []; } matrix[k].push(list[i]); } return matrix; } 

Uso:

 var matrix = listToMatrix([1, 2, 3, 4, 4, 5, 6, 7, 8, 9], 3); // result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Você pode usar a function Array.prototype.reduce para fazer isso em uma linha.

Estilo ECMAScript 6:

 myArr.reduce((rows, key, index) => (index % 3 == 0 ? rows.push([key]) : rows[rows.length-1].push(key)) && rows, []); 

JavaScript “normal”:

 myArr.reduce(function (rows, key, index) { return (index % 3 == 0 ? rows.push([key]) : rows[rows.length-1].push(key)) && rows; }, []); 

Você pode alterar o número 3 para o número de colunas desejado ou, melhor ainda, colocá-lo em uma function reutilizável:

Estilo ECMAScript 6:

 const toMatrix = (arr, width) => arr.reduce((rows, key, index) => (index % width == 0 ? rows.push([key]) : rows[rows.length-1].push(key)) && rows, []); 

JavaScript “normal”:

 function toMatrix(arr, width) { return arr.reduce(function (rows, key, index) { return (index % width == 0 ? rows.push([key]) : rows[rows.length-1].push(key)) && rows; }, []); } 

Que tal algo como:

 var matrixify = function(arr, rows, cols) { var matrix = []; if (rows * cols === arr.length) { for(var i = 0; i < arr.length; i+= cols) { matrix.push(arr.slice(i, cols + i)); } } return matrix; }; var a = [0, 1, 2, 3, 4, 5, 6, 7]; matrixify(a, 2, 4); 

http://jsfiddle.net/andrewwhitaker/ERAUs/

Basta usar dois loops for:

 var rowNum = 3; var colNum = 3; var k = 0; var dest = new Array(rowNum); for (i=0; i 
 function matrixify( source, count ) { var matrixified = []; var tmp; // iterate through the source array for( var i = 0; i < source.length; i++ ) { // use modulous to make sure you have the correct length. if( i % count == 0 ) { // if tmp exists, push it to the return array if( tmp && tmp.length ) matrixified.push(tmp); // reset the temporary array tmp = []; } // add the current source value to the temp array. tmp.push(source[i]) } // return the result return matrixified; } 

Se você quiser realmente replace os valores internos de um array, acredito que você pode chamar o seguinte:

 source.splice(0, source.length, matrixify(source,3)); 

Este código é genérico não precisa se preocupar com tamanho e matriz, funciona universalmente

  function TwoDimensional(arr, size) { var res = []; for(var i=0;i < arr.length;i = i+size) res.push(arr.slice(i,i+size)); return res; } 
  1. Definindo matriz vazia.
  2. Iterar de acordo com o tamanho para que possamos obter especificado pedaço.É por isso que eu estou incrementando i com tamanho , porque o tamanho pode ser 2,3,4,5,6 ......
  3. Aqui, primeiro eu estou cortando de i para (i + size) e então eu estou empurrando para res array vazio.
  4. Devolva o array bidimensional.
 function chunkArrToMultiDimArr(arr, size) { var newArray = []; while(arr.length > 0) { newArray.push(arr.slice(0, size)); arr = arr.slice(size); } return newArray; } //example - call function chunkArrToMultiDimArr(["a", "b", "c", "d"], 2); 
 function changeDimension(arr, size) { var arrLen = arr.length; var newArr = []; var count=0; var tempArr = []; for(var i=0; i 

Um repository incrível aqui .

  • api: masfufa.js

  • amostra: masfufa.html

De acordo com essa amostra, o snippet a seguir resolve o problema:

  jsdk.getAPI('my'); var A=[1, 2, 3, 4, 5, 6, 7, 8, 9]; var MX=myAPI.getInstance('masfufa',{data:A,dim:'3x3'}); 

então :

 MX.get[0][0] // -> 1 (first) MX.get[2][2] // ->9 (last) 
 function matrixify(array, n, m) { var result = []; for (var i = 0; i < n; i++) { result[i] = array.splice(0, m); } return result; } a = matrixify(a, 3, 3); 

Uso de resposta curta:

 const gridArray=(a,b)=>{const d=[];return a.forEach((e,f)=>{const h=Math.floor(f/b);d[h]=d[h]||[],d[h][f%b]=a[f]}),d}; 

Onde:

 a: is the array b: is the number of columns 

Resposta longa você pode ler o artigo:

Como converter uma matriz de comprimento ‘n’ para grade de matriz