iT邦幫忙

0

Array in Array in JavaScript

用不同的方法來宣告a和b兩個兩層陣列,然後修改a和b的[0][0],為什麼a會出現這種結果呢? 有方法可以令a的結果和b一樣嗎?

https://ithelp.ithome.com.tw/upload/images/20200704/2011981570ZuMByejU.png

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-04 10:26:47

抱歉,我有點不懂你的問題。
目前看起來是正確的輸出。

你所謂的結果一樣是指???

如果要一樣的話。就

   b=a

好吧,我承認我在耍白。只是你的問題讓人搞不懂你要啥結果。

hypons iT邦新手 5 級 ‧ 2020-07-04 11:09:33 檢舉

宣告變數後。我想修改a[0][0] 為 9,但 a[0][0]、a[1][0]、a[2][0] 都變成9了。
但用b方法宣告的陣列就不會,我想知是甚麼原因,謝謝

hypons iT邦新手 5 級 ‧ 2020-07-04 11:09:33 檢舉

宣告變數後。我想修改a[0][0] 為 9,但 a[0][0]、a[1][0]、a[2][0] 都變成9了。
但用b方法宣告的陣列就不會,我想知是甚麼原因,謝謝

fillano iT邦超人 1 級 ‧ 2020-07-06 09:23:18 檢舉

fill(new Array(2).fill(1)),其實填入的是同一個陣列,只是填了三次。

1
咖咖拉
iT邦新手 1 級 ‧ 2020-07-04 10:36:44
let a = new Array(3).fill(new Array(2).fill(2));

?

hypons iT邦新手 5 級 ‧ 2020-07-04 11:10:05 檢舉

宣告變數後。我想修改a[0][0] 為 9,但 a[0][0]、a[1][0]、a[2][0] 都變成9了。
但用b方法宣告的陣列就不會,我想知是甚麼原因,謝謝

4
listennn08
iT邦研究生 2 級 ‧ 2020-07-04 11:54:40

Array.fill()
這個問題是因為你用 fill
fill 填入物件有 pass by reference 的特性
當 fill 方法獲得一個傳入的物件,會將傳入的物件位置進行複製,並把其參考值(reference)之拷貝填入陣列中。

let a = new Array(3).fill(new Array(2).fill(1));
// 可以看成
let in_a = new Array(2).fill(1);
let a = new Array(3).fill(in_a); // a = [ in_a, in_a, in_a ];

所以 a 陣列的值 都是參考同一個物件
a[0][0], a[1][0] a[2][0]也會一樣變更

如這位大大所說的,這就是所謂的淺拷貝特性。

如果一定要用 fill 的方式做,可以使用下列方式

let a = new Array(3).fill(undefined).map(x => new Array(2).fill(1))
// a = [[1,1],[1,1],[1,1]]

a[0][0] = 9
// a = [[9,1],[1,1],[1,1]]

如果不強制用 fill 可以使用這種方式 :

let a = [...Array(3)].map(x => [1,1])
hypons iT邦新手 5 級 ‧ 2020-07-04 12:33:35 檢舉

我白明了,謝謝兩位大大。

我要發表回答

立即登入回答