代码之家  ›  专栏  ›  技术社区  ›  ScottMcC

如何在Javascript中转换存储为一维数组的二维方阵

  •  5
  • ScottMcC  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  4
  •   Nina Scholz    6 年前

    您可以获取数组维度的长度,并在新数组的特定索引上映射项。

    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(' '));
        2
  •  2
  •   Ray Toal    6 年前

    对于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);

    这个答案避免了除法和地板(整数除法),一个像样的优化器应该使代码相对快速。您还可以考虑使用

    let newArray = new Array(9);
    

    let newArray = new Array(N * N);
    

    但是在尝试像这样的“优化”之前先分析代码。

        3
  •  0
  •   Sameera Prasad Jayasinghe    6 年前
    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]);
        }
    }
    
        4
  •  0
  •   Emil S. Jørgensen    6 年前

    为矩阵设置一个最大“宽度”,并在循环中插入一个新数组,每次运行偏移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());