【问题标题】:Convert 1D array into 2D array JavaScript将一维数组转换为二维数组 JavaScript
【发布时间】:2021-07-20 23:46:38
【问题描述】:

您好,我有这个例子,我希望我的一维数组是一个二维数组 4x3

var array1 = [15, 33, 21, 39, 24, 27, 19, 7, 18, 28, 30, 38];
var i, j, t;
var positionarray1 = 0;
var array2 = new Array(4);

for (t = 0; t < 4; t++) {
  array2[t] = new Array(3);
}

for (i = 0; i < 4; i++) {
  for (j = 0; j < 3; j++) {
    array2[i][j] = array1[i];
    array2[i][j] = array1[j];
  }

  positionarray1 = positionarray1 + 1; //I do this to know which value we are taking
}

console.log(array2);

我的解决方案只给我 array1 的第一个数字。有什么想法吗?

【问题讨论】:

标签: javascript arrays for-loop multidimensional-array


【解决方案1】:

使用 1 个循环提高效率的解决方案:

const arr1D = new Array(19).fill(undefined).map((_, i) => i);
const arr2D = [];
const cols = 3;

for (let i = 0, len = arr1D.length; i < len; ++i) {
  const col = i % cols;
  const row = Math.floor(i / cols);
  if (!arr2D[row]) arr2D[row] = []; // create an array if not exist
  arr2D[row][col] = arr1D[i];
}

console.log({ arr1D, arr2D });

【讨论】:

    【解决方案2】:
    var array1 = [15, 33, 21, 39, 24, 27, 19, 7, 18, 28, 30, 38];
    var i, j, t;
    var positionarray1 = 0;
    var array2 = new Array(4);
    
    for (t = 0; t < 4; t++) {
      array2[t] = new Array(3);
    }
    
    for (i = 0; i < 4; i++) {
      for (j = 0; j < 3; j++) {
        array2[i][j] = array1[i*3+j]; //here was the error
      }
    
      positionarray1 = positionarray1 + 1; //I do this to know which value we are taking
    }
    
    console.log(array2);
    

    我刚刚解决了感谢您的 cmets。我实际上使用了一个分配,但它是 3 而不是 2。

    【讨论】:

      【解决方案3】:

      如果您将 i 重命名为 row 并将 j 重命名为 col,则更容易看到发生了什么。另外,避免幻数。我到处都看到34。这些可以用参数引用替换。您只需将逻辑包装在一个可重用的函数中(如下面的reshape 函数所示)。

      主要算法是:

      result[row][col] = arr[row * cols + col];
      

      不需要跟踪位置,因为它可以从当前行和列计算出来。

      const reshape = (arr, rows, cols) => {
        const result = new Array(rows);
        for (let row = 0; row < rows; row++) {
          result[row] = new Array(cols);
        }
        for (let row = 0; row < rows; row++) {
          for (let col = 0; col < cols; col++) {
            result[row][col] = arr[row * cols + col];
          }
        }
        return result;
      };
      
      const array1 = [15, 33, 21, 39, 24, 27, 19, 7, 18, 28, 30, 38];
      const array2 = reshape(array1, 4, 3);
      
      console.log(JSON.stringify(array2));
      .as-console-wrapper { top: 0; max-height: 100% !important; }

      【讨论】:

        【解决方案4】:

        i 和 j 是新二维数组的索引,最多只能运行 0 到 3 和 0 到 2,这就是为什么您一遍又一遍地看到开始值的原因。您需要一种方法来索引从 0 到 11 的 array1。

        看起来你在“positionarray1”和“position”的正确轨道上,虽然你需要移动你要增加它的地方。您需要在索引 array1 而不是 i 和 j 时使用该值:

            array2[i][j] = array1[positionarray1];
        
            array2[i][j] = array1[positionarray1];
        
            positionarray1++;
        

        【讨论】: