2015-06-29 63 views
0

以下代碼工作正常,但我被要求在下面的代碼中找到一個錯誤。任何人都可以指出。用默認值填充多維javascript數組矩陣

function defaultMatrix(size) { 
    var defaultValue = 0; 
    var row = []; 
    var matrix = []; 
    for (var i=0; i < size; i++) { row.push(defaultValue); } 
    for (var i=0; i < size; i++) { matrix.push(row); } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 
+1

'row'被重用。 IOW,每一行都是對同一個數組的引用,所以對一行的修改會影響所有行。 – bgoldst

+0

您可以提供關於函數如何執行的更多信息嗎? –

+1

它應該用默認的零填充矩陣。這就是我所擁有的一切。所以我認爲@bgoldst提供的答案是有道理的。我已通過更改一個值進行測試,並導致在所有行中發生更改。 – rmsorPth

回答

-1

您正在將大小乘以相同的行,最終導致size * size大。

function defaultMatrix(size) { 
    var defaultValue = 0; 
    var rows = []; 
    var matrix = []; 
    for (var i=0; i < size; i++) { 

     // create row 
     rows[i] = []; 

     // create cells 
     for (var j=0; j < size; j++) { 
      rows[i].push(defaultValue); 
     } 

     // add row to matrix 
     matrix.push(rows[i]); 
    } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 

如果你想與0每次初始化矩陣,那麼你就可以進一步簡化這樣的腳本:

function defaultMatrix(size) { 
    var matrix = []; 
    for (var i=0; i < size; i++) { 
     matrix.push(new Array(size)); 
    } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 
0

我認爲這是JS錯誤的數組引用的對象。所以,在你的情況下,你只創建一個矩陣一次。然後你將它推入行中。

因此,在這種情況下,如果做一個代碼,如:

let arr = defaultMatrix(2); 
arr[0][0] = 1; 

你顯示ARR [1] [0]和ARR [2] [0]的值是 「1」,因爲該陣列在所有arr [n]上都是一樣的。

爲了解決這個問題,你必須在每一行中創建一個新的數組。爲了解決您的代碼,您只需要更改1行:

for (var i=0; i < size; i++) { matrix.push(row.slice()); } 

slice創建當前數組的副本。

但你可以做到這一切在同一行,像這樣:

function defaultMatrix(size, defaultValue = 0) { 
    return Array(size).fill(0).map(() => {return Array(size).fill(defaultValue)}); 
}