2015-12-03 79 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