如何在Javascript中转置存储为1D数组的2D方阵

时间:2018-08-13 06:52:37

标签: javascript arrays

我的问题与此问题密切相关,但是我正在寻找Javascript解决方案

How to Transpose 2D Matrix Stored as C 1D Array

基本上我有一个二维正方形矩阵

1 2 3
4 5 6
7 8 9

存储如下

let anArray = [1 ,2, 3, 4, 5, 6, 7, 8, 9]

如何转置此矩阵,以便按以下方式切换源数组的元素?

let newArray = [1, 4, 7, 2, 5, 8, 3, 6, 9] 

4 个答案:

答案 0 :(得分:4)

您可以获取数组维度的长度,然后将项目映射到新数组的特定索引上。

var array = [1 ,2, 3, 4, 5, 6, 7, 8, 9],
    n = Math.sqrt(array.length),
    transposed = array.map((_, i, a) => a[(i % n) * n + Math.floor(i / n)]);
    
console.log(transposed.join(' '));

答案 1 :(得分:2)

您链接的答案中的方法在JavaScript中也很好用。

对于3 x 3:

const anArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];

let newArray = [];
for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    newArray[3 * i + j] = anArray[3 * j + i];
  }
}

console.log(newArray);

对于N x N,只需将3替换为N。

此答案避免了除法和下限(整数除法),并且不错的优化程序应使代码相对较快。您还可以考虑使用

初始化新数组
let newArray = new Array(9);

let newArray = new Array(N * N);

但是在尝试诸如此类的“优化”之前先分析代码。

答案 2 :(得分:0)

var arr1 = [];
var arr2 = [];



for(int i=0; i<mat.length; i++) {
    for(int j=0; j<mat[i].length; j++) {
        arr1.push(mat[i][j]);
    }
}

for(int j=0; j<mat[i].length; j++) {
    for(int i=0; i<mat.length; i++) {
        arr2.push(mat[i][j]);
    }
}

答案 3 :(得分:0)

为矩阵设置最大“宽度”,然后循环插入新数组,每次运行都偏移1。

function transpose(list, width) {
  if (width === void 0) {
    width = 1;
  }
  var t = 0;
  var transposed = [];
  while (t < width) {
    for (var index = t; index < list.length; index += width) {
      transposed.push(list[index]);
    }
    t++;
  }
  return transposed;
}
//TEST
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var transposed = transpose(list, 3);
console.log(list.join());
console.log(transposed.join());