2015-12-03 52 views
0

我想创建一个这样的数组矩阵:如何创建一个充满零的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次,对于非常简单的事情来说效率非常低。

+0

你特别需要0为默认值?你可以只是初始化空数组:'var arr = new Array(4)',默认值是undefined,'arr.length === 4' – vergilius

+0

我需要明确地使数值为4,这要归功于 – jmancherje

+1

为什么不你只要这样做,var array = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,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中是。因人而异。

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看到这是最快的。我在测试:

  • 火狐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
+0

对于'Array',您不需要'new'关键字。在我看来,阅读起来要容易一些。对于'Array.prototype.fill'变种,你将有'numRows'次数相同的数组。看到我的答案。 +1阵列解决方案! – kay

+0

的确如此,但我在编写答案时略微修改了这个问题;)我想先挖掘@ Kay的评论,然后编辑我的答案以更好地适应更新后的问题。 – NoobsArePeople2

+0

@Kay很好的抓住我的'Array.prototype.fill'错误。我修复了它并更新了jsPerf测试。 – NoobsArePeople2