Trocar linhas com colunas (transposição) de uma matriz em javascript

Por exemplo, eu tenho uma matriz como esta:

|1 2 3| |4 5 6| |7 8 9| 

e preciso convertê-lo em uma matriz como esta:

 |1 4 7| |2 5 8| |3 6 9| 

Qual é a melhor e melhor maneira de atingir esse objective?

    Ver artigo: Transpor uma matriz em JavaScript e jQuery

     function transpose(a) { // Calculate the width and height of the Array var w = a.length || 0; var h = a[0] instanceof Array ? a[0].length : 0; // In case it is a zero matrix, no transpose routine needed. if(h === 0 || w === 0) { return []; } /** * @var {Number} i Counter * @var {Number} j Counter * @var {Array} t Transposed data is stored in this array. */ var i, j, t = []; // Loop through every item in the outer array (height) for(i=0; i 

    Pesquisando isso aconteceu. Surpreendentemente, é ainda mais conciso e completo do que a resposta de Nikita . Ele recupera os comprimentos de coluna e linha implicitamente nas entranhas de map() .

     function transpose(a) { return Object.keys(a[0]).map(function(c) { return a.map(function(r) { return r[c]; }); }); } console.log(transpose([ [1,2,3], [4,5,6], [7,8,9] ])); 

    Assim como em qualquer outro idioma:

     int[][] copy = new int[columns][rows]; for (int i = 0; i < rows; ++i) { for (int j = 0; j < columns; ++j) { copy[j][i] = original[i][j]; } } 

    Você só precisa construir o array 2D de maneira diferente no JS. Como isso:

     function transpose(original) { var copy = []; for (var i = 0; i < original.length; ++i) { for (var j = 0; j < original[i].length; ++j) { // skip undefined values to preserve sparse array if (original[i][j] === undefined) continue; // create row if it doesn't exist yet if (copy[j] === undefined) copy[j] = []; // swap the x and y coords for the copy copy[j][i] = original[i][j]; } } return copy; } console.log(transpose([ [1,2,3], [4,5,6], [7,8,9] ])); 

    Eu não tenho reputação suficiente para comentar (wtf.), Então eu preciso postar a versão atualizada de Ken como uma resposta separada:

     function transpose(a) { return a[0].map(function (_, c) { return a.map(function (r) { return r[c]; }); }); } 

    Versão compacta da resposta do Hobs usando as funções de seta do ES6:

     function transpose(matrix) { return Object.keys(matrix[0]) .map(colNumber => matrix.map(rowNumber => rowNumber[colNumber])); } 

    Você pode usar Object.keys e Array.prototype.map :

     function transpose(arr) { return Object.keys(arr[0]).map(function (c) { return arr.map(function (r) { return r[c]; }); }); } console.log(transpose([ [1,2,3], [4,5,6], [7,8,9] ]));