2014-04-09 44 views
0

我是javascript新手。我的sudoku遊戲有一個9*9網格。 html是這樣的,網格的每個框是一個input元素與id像r1c4其中1號碼和4號碼。我已經半滿grid.I需要在網格中所有數字存儲在twoarray。我已經創建了下面的函數FO:在javascript中未獲得預期的函數返回值

function getValues(){ 

    var grid = new Array(); 
    var colData = new Array(); 
    var targetId; 

    for(var i=1;i<=9;i++) 
    { 
     for(var j=1;j<=9;j++) 
     { 
      targetId = 'r' + i + 'c' + j; 
      colData[j-1] = document.querySelector('#'+targetId).value; 

     } 
     grid[i-1] = colData; 
     console.log(grid[i-1]); // here logged correctly 
    } 
    return grid; // here returned wrong 
} 

我面臨的問題是,返回數組只包括最後一個元素重複了9次。我每次都使用console.log(grid[i-1]);來記錄存儲的值,並且它給出了正確的結果。我沒有得到它。

問候。

+0

本頁出色的答案。不知道誰低估了你的問題,但我+1了平衡:) – A1rPun

回答

2
grid[i-1] = colData; 

你是不是複製colDatagrid[i-1],而只是在grid[i-1]參考,colData。所以,數組中的所有元素只是對同一個對象colData的引用。

要解決此問題,您需要在每次迭代中創建一個新的Array。所以,我會做這樣的

function getValues() { 
    var grid = [], colData, targetId; 

    for (var i = 1; i <= 9; i++) { 
     colData = [];  // new Array on every iteration 
     for (var j = 1; j <= 9; j++) { 
      targetId = 'r' + i + 'c' + j; 
      colData.push(document.querySelector('#' + targetId).value); 
     } 
     grid.push(colData); 
    } 
    return grid; 
} 
2

您需要創建每次迭代新colData,而不是每次都使用同一個。

for(var i=1;i<=9;i++) 
{ 
    var colData = new Array(); 
    ... 
2

嘗試要麼for循環移動i內部colData = new Array()(或更好,colData = [];)。使用grid[i-1] = colData.slice(0);

無論哪種方式,你需要爲每一行創建一個新的數組,而不僅僅是重用舊數組。

2

您正在使用相同每個列的數組對象,只是覆蓋值。你將同一個數組的9個引用推入網格。

您需要在循環內移動var colData = new Array();,以便爲每列創建新的數組。