如何创建一个充满零的nxn矩阵(数组数组)?
我想创建一个这样的数组矩阵:如何创建一个充满零的nxn矩阵(数组数组)?
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次,对于非常简单的事情来说效率非常低。
与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())
速度?
- N = 4:http://jsperf.com/creatematrix/1
- N = 8:http://jsperf.com/creatematrix/2
- N = 16:http://jsperf.com/creatematrix/3
- N = 32:http://jsperf.com/creatematrix/4
貌似Array.prototype.fill()
变体变快作为基质增长(相对于循环)。至少在Firefox中是。因人而异。
有一对夫妇的方法,你可以采取:
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看到这是最快的。我在测试:
- 火狐42.0 32位Windows NT上10.0的64位
- 的Chrome 44.0.2403.130 32位Windows NT上10。0 64位 在Windows NT
- 的Chrome 47.0.2526.73 32位10.0的64位
- Android浏览器在Android 42.0(壁虎)6.0
对于'Array',您不需要'new'关键字。在我看来,阅读起来要容易一些。对于'Array.prototype.fill'变种,你将有'numRows'次数相同的数组。看到我的答案。 +1阵列解决方案! – kay
的确如此,但我在编写答案时略微修改了这个问题;)我想先挖掘@ Kay的评论,然后编辑我的答案以更好地适应更新后的问题。 – NoobsArePeople2
@Kay很好的抓住我的'Array.prototype.fill'错误。我修复了它并更新了jsPerf测试。 – NoobsArePeople2
你特别需要0为默认值?你可以只是初始化空数组:'var arr = new Array(4)',默认值是undefined,'arr.length === 4' – vergilius
我需要明确地使数值为4,这要归功于 – jmancherje
为什么不你只要这样做,var array = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] ;' –