Transposing a 2D-array in JavaScript

后端 未结 23 2902
难免孤独
难免孤独 2020-11-22 01:40

I\'ve got an array of arrays, something like:

[
    [1,2,3],
    [1,2,3],
    [1,2,3],
]

I would like to transpose it to get the following

相关标签:
23条回答
  • 2020-11-22 02:24

    Neat and pure:

    [[0, 1], [2, 3], [4, 5]].reduce((prev, next) => next.map((item, i) =>
        (prev[i] || []).concat(next[i])
    ), []); // [[0, 2, 4], [1, 3, 5]]
    

    Previous solutions may lead to failure in case an empty array is provided.

    Here it is as a function:

    function transpose(array) {
        return array.reduce((prev, next) => next.map((item, i) =>
            (prev[i] || []).concat(next[i])
        ), []);
    }
    
    console.log(transpose([[0, 1], [2, 3], [4, 5]]));
    

    Update. It can be written even better with spread operator:

    const transpose = matrix => matrix.reduce(
        ($, row) => row.map((_, i) => [...($[i] || []), row[i]]), 
        []
    )
    
    0 讨论(0)
  • 2020-11-22 02:24

    You can do it in in-place by doing only one pass:

    function transpose(arr,arrLen) {
      for (var i = 0; i < arrLen; i++) {
        for (var j = 0; j <i; j++) {
          //swap element[i,j] and element[j,i]
          var temp = arr[i][j];
          arr[i][j] = arr[j][i];
          arr[j][i] = temp;
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-22 02:25

    A library-free implementation in TypeScript that works for any matrix shape that won't truncate your arrays:

    const rotate2dArray = <T>(array2d: T[][]) => {
        const rotated2d: T[][] = []
    
        return array2d.reduce((acc, array1d, index2d) => {
            array1d.forEach((value, index1d) => {
                if (!acc[index1d]) acc[index1d] = []
    
                acc[index1d][index2d] = value
            })
    
            return acc
        }, rotated2d)
    }
    
    0 讨论(0)
  • 2020-11-22 02:26

    shortest way with lodash/underscore and es6:

    _.zip(...matrix)
    

    where matrix could be:

    const matrix = [[1,2,3], [1,2,3], [1,2,3]];
    
    0 讨论(0)
  • 2020-11-22 02:26

    I found the above answers either hard to read or too verbose, so I write one myself. And I think this is most intuitive way to implement transpose in linear algebra, you don't do value exchange, but just insert each element into the right place in the new matrix:

    function transpose(matrix) {
      const rows = matrix.length
      const cols = matrix[0].length
    
      let grid = []
      for (let col = 0; col < cols; col++) {
        grid[col] = []
      }
      for (let row = 0; row < rows; row++) {
        for (let col = 0; col < cols; col++) {
          grid[col][row] = matrix[row][col]
        }
      }
      return grid
    }
    
    0 讨论(0)
  • 2020-11-22 02:27

    Another approach by iterating the array from outside to inside and reduce the matrix by mapping inner values.

    const
        transpose = array => array.reduce((r, a) => a.map((v, i) => [...(r[i] || []), v]), []),
        matrix = [[1, 2, 3], [1, 2, 3], [1, 2, 3]];
    
    console.log(transpose(matrix));

    0 讨论(0)
提交回复
热议问题