在javascript中创建“m x n”二维数组

时间:2015-12-29 05:29:46

标签: javascript arrays matrix linear-algebra

想要在javascript中创建一个二维m x n数组,基于列数,在我的函数中作为参数输入,行将从另一个参数创建,该参数将是一个数组。

我希望实现的目标 - 期望的结果:

var arr = [0,1,2,3,4,5,6,7,8,9]

function TwoDimensionalArray(numRows, numCols) {
//Magic happens here!
}

TwoDimensionalArray(arr, 4);

如您所见,下面是一个3 x 4矩阵和一个理想的结果

[[0,1,2,3], [4,5,6,7],[8,9]]

输入大小没有差别,列数是关键因素和决定因素。

我目前所拥有的 - 不理想的结果:

var arr = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]

function TwoDimensionalArray(numRows, numColumns) {
   var twoD = [];

   for (var row = 0; row < numRows.length; ++row) {

     var cardIndex = numRows[row]

      // console.log(numRows[row]);

       var columns = [];

     for(var j =0; j < numColumns; ++j) {
        columns[j] = cardIndex;
    }

    twoD[cardIndex] = columns;
}

return twoD;
 };


var matrixTwoD = TwoDimensionalArray(arr, 4);

console.log(matrixTwoD);
console.log(matrixTwoD[0][0]);
console.log(matrixTwoD[0][1]);
console.log(matrixTwoD[0][2]);
console.log(matrixTwoD[0][3]);

我当前的代码创建了一个数组,每个元素重复4次,直到数字13的列数为4:[[0,0,0,0], [1,1,1,1]....[13,13,13,13]]

也许我在for循环中做错了或没有正确处理问题。但是,任何事情都指向我正确的方向来获得上述愿望的结果。

BOUNS

也有人也可以指出我有关此类问题的矩阵代数的额外资源以及一般有助于自学的任何内容。

非常感谢!

2 个答案:

答案 0 :(得分:2)

保持简单,将输入数组切成numCols长度

的部分
function TwoDimensionalArray(arr, numCols) {
    var arr2d = [],
        i;
    if (numCols) // safety first!
        for (i = 0; i < arr.length; i += numCols)
            arr2d.push(arr.slice(i, i + numCols));

    return arr2d;
}
  • if (numCols) numCols 未提供或0
  • 的情况下阻止无限循环
  • for (i = 0; i < arr.length; i += numCols)0 numCols开始计算,例如 i = 0, 4, 8, 16, ... ,直到我们达到大于arr.length
  • 的数字
  • arr.slice(i, i + numCols)从(包括)索引i开始创建数组子数组,结束于(不包括)索引{{1我们从i + numCols
  • 的索引numCols的项目开始,得到一个i数组
  • arr2d.push将新项目添加到arr
  • 的末尾

将所有这些放在一起,我们可以看到我们正在从数组arr2d 数组arr2d >

答案 1 :(得分:0)

计算所需的列,然后使用数组的切片方法。

开始索引=(numColumns * i) 结束索引= numColumns *(i + 1)

&#13;
&#13;
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

function TwoDimensionalArray(numRows, numColumns) {
  var columns = [];

  for (var i = 0; i !== Math.ceil(numRows.length / numColumns); i++) {
    columns[i] = numRows.slice((numColumns * i), numColumns * (i + 1))
      //console.log((numColumns * i) + " " +numColumns * (i + 1))
  }
  return columns;
};

var matrixTwoD = TwoDimensionalArray(arr, 4);

console.log(matrixTwoD);
console.log(matrixTwoD[0][0]);
console.log(matrixTwoD[0][1]);
console.log(matrixTwoD[0][2]);
console.log(matrixTwoD[0][3]);
&#13;
&#13;
&#13;