2016-09-25 93 views
-1

我在嘗試使用數組inArray,該數組隨for()循環的每次迭代而改變,並將其推送到多維數組medArray。有兩種不同的方法略有不同,一個實現了目標,而第二個輸出medArray,它有三個陣列,它們都等於最後一次迭代inArray將數組推送到Javascript中的多維數組中

我很困惑,爲什麼這個工程:

var inArray = [1, 2, 3]; 

var medArray = []; 



for(i = 0; i < 3; i++){ 
    inArray[i] += 1; 
//The difference is this line below 
    var test = [inArray[0], inArray[1], inArray[2]]; 
    medArray.push(test) 
    console.log(medArray); 
} 

但是,這並不工作:

var inArray = [1, 2, 3]; 

var medArray = []; 

for(i = 0; i < 3; i++){ 
    inArray[i] += 1; 
//The difference is this line below 
    var test = inArray; 
    medArray.push(test) 
    console.log(medArray); 
} 

當我單獨分配的test的值是inArray個人價值它的工作原理,但當我分配兩個數組相等,它不起作用。發生什麼事?

回答

1

第二輸出medArray使得其具有在其內三個陣列,他們都等於inArray最後一次迭代。

實際上,所述第二碼塊推相同陣列medArray三次。當你說temp = inArray沒有創建數組的副本時,它會創建對同一數組的另一個引用。 (所以,如果在循環之後,你說medArray[0][0] = 10你會發現medArray[1][0]medArray[2][0]現在都等於10過,因爲medArray[0]medArray[1]medArray[2]所有引用相同的陣列。)

如果你想使一個所述inArray陣列的拷貝然後使用the array .slice() method

var temp = inArray.slice(); 

然後temp將具有相同的元件inArray一個新的數組。在test = [inArray[0], inArray[1], inArray[2]];的第一個代碼塊中,你是這麼做的。

或者你可以省略temp變量,只是說:

medArray.push(inArray.slice()); 

.slice()也可以使用,如果你用參數來調用它來複制一個數組的只是一部分,但使用任何參數調用它的副本整個陣列)

在上下文:

var inArray = [1, 2, 3]; 
 
var medArray = []; 
 

 
for(var i = 0; i < 3; i++){ 
 
    inArray[i] += 1; 
 
    medArray.push(inArray.slice()); 
 
} 
 
console.log(medArray);

+0

你是最棒的!我已經掙扎了幾個小時。 –

相關問題