如何创建一个充满零的nxn矩阵(数组数组)?

时间:2015-12-03 00:03:20

标签: javascript arrays matrix

我想创建一个像这样的数组矩阵:

createMatrix(4);

// logs:
[[0,0,0,0],
 [0,0,0,0],
 [0,0,0,0],
 [0,0,0,0]];

目前我的解决方案是:

function createMatrix (n) {
  var innerArr;
  var outerArr = [];

  for (var i=0; i<n; i++){
    innerArr = [];
    for (var j=0; j<n; j++) {
      innerArr.push(0);
    }
    outerArr.push(innerArr);
  }
}

console.log(outerArr);

有更有效的方法吗?这将迭代nxn次,这非常简单。

2 个答案:

答案 0 :(得分:2)

使用ECMAScript 2015函数Array.prototype.fill()

Array(row_count).fill(Array(column_count).fill(0)).map(a => a.slice())

说明:

// a sparse array with row_count "absent" items:
Array(row_count)
// an array with column_count members with the value 0:
                      Array(column_count).fill(0)
// an array with row_count times the identic array as value:
Array(row_count).fill(Array(column_count).fill(0))
// shallow copy the inner array:
Array(row_count).fill(Array(column_count).fill(0)).map(a => a.slice())

速度

随着矩阵的增长(相对于循环),Array.prototype.fill()变体看起来更快。 至少在Firefox中。 YMMV。

答案 1 :(得分:2)

您可以采取以下几种方法:

的concat()/片()

var numCols = 4;
var numRows = 4;

var innerArrSrc = [];
var outerArr = [];

for (var i = 0; i < numCols; i++) {
    innerArrSrc.push(0);
}

for (var j = 0; j < numRows; j++) {
    outerArr.push(innerArrSrc.concat()); // Could also use innerArrSrc.slice();
}

Array.prototype.concat()Array.prototype.slice()都将返回源数组的浅表副本。

一维数组

或者,您可以将矩阵表示为一维数组而不是多维数组,并提供基于行列值访问特定索引的函数:

var numRows = 4;
var numCols = 4;
var len = numRows * numCols;

var outerArr = [];

for (var i = 0; i < len; i++) {
    outerArr.push(0);
}

访问以这种方式表示的矩阵的特定索引的函数可能如下所示:

function getMatrixIndex(myMatrix, col, row, numCols) {

    var index = row * numCols + col;
    return myMatrix[index];
}

Array.prototype.fill

如果您想利用新的ES6功能,Array.prototype.fill应该符合您的需求:

// Multi-dimensional
var numRows = 4;
var numCols = 4;

var outerArr = new Array(row_count).fill(new Array(column_count).fill(0)).map(a => a.slice());

// Or one-dimensional
var len = numRows * numCols;
var oneDim = new Array(row_count * column_count).fill(0);

jsPerf测试

您可以运行this jsPerf test以查看哪个最快。我已经测试过:

  • Firefox 42.0在Windows NT 10.0 64位上32位
  • Chrome 44.0.2403.130 32位Windows NT 10.0 64位
  • Chrome 47.0.2526.73 32位Windows NT 10.0 64位
  • Android 6.0上的Android Browser 42.0(Gecko)