我想创建一个像这样的数组矩阵:
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次,这非常简单。
答案 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)
您可以采取以下几种方法:
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];
}
如果您想利用新的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);
您可以运行this jsPerf test以查看哪个最快。我已经测试过: