在 JavaScript 中转置二维数组

新手上路,请多包涵

我有一个数组数组,比如:

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

我想转置它以获得以下数组:

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

使用循环以编程方式执行此操作并不困难:

 function transposeArray(array, arrayLength){
    var newArray = [];
    for(var i = 0; i < array.length; i++){
        newArray.push([]);
    };

    for(var i = 0; i < array.length; i++){
        for(var j = 0; j < arrayLength; j++){
            newArray[j].push(array[i][j]);
        };
    };

    return newArray;
}

然而,这看起来很笨重,我觉得应该有一种更简单的方法来做到这一点。在那儿?

原文由 ckersch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 577
2 个回答
output = array[0].map((_, colIndex) => array.map(row => row[colIndex]));

map 调用提供的 callback 为数组中的每个元素按顺序调用一次函数,并根据结果构造一个新数组。 callback 仅针对已赋值的数组索引调用;它不会为已删除或从未赋值的索引调用。

callback 使用三个参数调用:元素的值、元素的索引和正在遍历的 Array 对象。 [资源]

原文由 Fawad Ghafoor 发布,翻译遵循 CC BY-SA 4.0 许可协议

这里有很多好的答案!我将它们合并为一个答案并更新了一些代码以获得更现代的语法:

灵感来自 Fawad GhafoorÓscar Gómez Alcañiz 的 One-liner

 function transpose(matrix) {
  return matrix[0].map((col, i) => matrix.map(row => row[i]));
}

function transpose(matrix) {
  return matrix[0].map((col, c) => matrix.map((row, r) => matrix[r][c]));
}

reduce 的函数式方法风格 by Andrew Tatomir

 function transpose(matrix) {
  return matrix.reduce((prev, next) => next.map((item, i) =>
    (prev[i] || []).concat(next[i])
  ), []);
}

marcel 的 Lodash/Underscore

 function tranpose(matrix) {
  return _.zip(...matrix);
}

// Without spread operator.
function transpose(matrix) {
  return _.zip.apply(_, [[1,2,3], [1,2,3], [1,2,3]])
}

Vigrant 提供的更简单的 Lodash/ Underscore 解决方案

_.unzip(matrix);

普通方法

function transpose(matrix) {
  const rows = matrix.length, cols = matrix[0].length;
  const grid = [];
  for (let j = 0; j < cols; j++) {
    grid[j] = Array(rows);
  }
  for (let i = 0; i < rows; i++) {
    for (let j = 0; j < cols; j++) {
      grid[j][i] = matrix[i][j];
    }
  }
  return grid;
}

Emanuel Saringan 启发的香草就地 ES6 方法

function transpose(matrix) {
  for (var i = 0; i < matrix.length; i++) {
    for (var j = 0; j < i; j++) {
      const temp = matrix[i][j];
      matrix[i][j] = matrix[j][i];
      matrix[j][i] = temp;
    }
  }
}

// Using destructing
function transpose(matrix) {
  for (var i = 0; i < matrix.length; i++) {
    for (var j = 0; j < i; j++) {
      [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
    }
  }
}

原文由 Yangshun Tay 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题