2016-08-04 26 views
1

我想創建一個二維數組,但我發現一個有趣的現象使用新的Array()。創建二維數組fill(0)bug?

const column = 10; 
const row = 10; 

let matrix = new Array(row).fill(new Array(column).fill(0)); 

matrix[0][1] = 1; 

console.log(matrix) 

讓我吃驚,我得到的結果如下:

0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 

整列1號設定爲1,我可以知道爲什麼我會得到這種行爲?

+1

所有數組元素都指單個數組 –

+0

@PranavCBalan你是否介意更多? – Tim

+0

'new Array(column).fill(0)'創建一個長度爲'column'且元素爲'0'的數組。 '新的數組(行).fill(....)'它填充你創建的數組,而不是爲每個數組創建不同的數組...而是引用數組作爲元素 –

回答

1

Array#fill方法填充相同的數組,該元素是引用單個數組。所以你需要創建單獨的數組作爲元素。所以更新一個會反映所有其他,因爲它們不是不同的數組,它們是相同的。

使用Array.from()您可以通過map function創建並生成值。

const column = 10; 
 
const row = 10; 
 

 
let matrix = Array.from({ 
 
    // create array of length `row` 
 
    length: row 
 
    // map function to generate values 
 
},() => new Array(column).fill(0)); 
 

 
matrix[0][1] = 1; 
 

 
console.log(matrix)

+0

sry,仍然沒有得到它爲什麼會引用單個數組?因爲它會生成新數組的「行」次數? – Tim

+1

@Tim:首先它創建一個長度爲'row'的數組,然後它填充單個數組.......填充行爲像'matrix [0] = matrix [1] = .. = matrix [row - 1] = new Array(column).fill(0);'所以所有的數組元素引用相同的數組.... –

+1

@Tim:數組將會像'ref = [.....]; [ref, ref,ref,...,ref]'.... –

0

@PranavCBalan有權。

這是類似的東西:

let matrix = new Array(row); 
var x = new Array(column).fill(0); 
matrix[0] = matrix[1] = .. = matrix[column - 1] = x; 

你的矩陣是一個對象的數組。