2016-04-07 47 views
2

非常感謝您花時間幫助我解決這個問題。For-Loop生成多維數組

我正在嘗試使用for循環生成一個如此簡單的板。

var board = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]; 

但是,我的下面的嘗試沒有成功。

function makeBoard(n){ 
    var board=[]; 
    for(var i=0; i<n; i++){ 
    for(var j=0; j<n; j++){ 
     board[i][j]=0; 
    } 
    } 
    return board; 
} 

從技術上講,我可以使用上面顯示的板子變量,然後繼續,但我更關心這個原理。使用for循環創建多維數組是不可能的?有沒有簡單的方法來完成這個使用array.push()?

回答

2

JavaScript沒有多維數組,所以你必須使用一個數組的數組來代替:

function makeBoard(n){ 
    var board=[]; 
    for(var i=0; i<n; i++){ 
    board[i] = []; 
    for(var j=0; j<n; j++){ 
     board[i][j]=0; 
    } 
    } 
    return board; 
} 

你失蹤創建的每個陣列的第二維度所需的board[i] = [];

注意:您還可以使用Array.prototype.fill

function makeBoard(n){ 
    var board=[]; 
    for(var i=0; i<n; i++){ 
    board[i] = Array(n).fill(0); 
    } 
    return board; 
} 
+0

Array.fill() - 太棒了!謝謝保羅! – Trevor

+0

只適用於[選定的用戶代理](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill#Browser_compatibility)。 –

+0

@isvforall這不起作用,因爲'Array.fill'不會執行深層複製。你最終得到了'board [0] === board [1] === board [2] ...'對同一個數組的所有引用 – Paulpro

1

你需要爲每一個新的子數組的初始化爲array

function makeBoard(n){ 
 
    var board=[]; 
 
    for(var i=0; i<n; i++){ 
 
     board[i] = []; // <-- this is missing! 
 
     for(var j=0; j<n; j++){ 
 
      board[i][j]=0; 
 
     } 
 
    } 
 
    return board; 
 
} 
 
document.write('<pre>' + JSON.stringify(makeBoard(5), 0, 4) + '</pre>');

另一個版本沒有for循環

function makeBoard(n){ 
 
    return Array.apply(null, {length: n}).map(function() { 
 
     return Array.apply(null, {length: n}).map(function() { 
 
      return 0; 
 
     }); 
 
    }); 
 
} 
 
document.write('<pre>' + JSON.stringify(makeBoard(5), 0, 4) + '</pre>');

0

您生成一個數組,然後循環的裏面新的陣列。像這樣:

var arr = new Array(10); 
for (var i = 0; i < 10; i++) { 
    arr[i] = new Array(6); 
}