2016-06-16 8 views
1

Es gibt Arrays in einem Array. Das erste Array sollte umgekehrt werden. Ich dachte r[0].reverse() würde dies tun, aber diese kehrtalle Arrays.Umkehren eines Arrays in einem Array kehrt alle Arrays im Array um

Kann jemand erklären, warum das passiert?

+0

Der Effekt wird auf 'reverse' nicht lokalisiert. Sie könnten 'r [0] [3] =" d "' machen und es würde gleichermaßen "alle Arrays" gleichzeitig ändern. Es ist eigentlich nur ein Array. – 4castle

+0

Objekte sind Referenztypen in JS. Sie müssen die Arrays klonen. – Redu

Antwort

7

Sie drücken die Referenz des Arrays, so dass eine Aktualisierung Änderungen an dem Rest vornehmen wird, da es sich um einzelne Arrays handelt. Stattdessen schieben Sie die Kopie des Original-Array zum Kopieren Array verwenden Array#slice Methode.

var alph = ["a", "b", "c"]; 
 
var r = []; 
 

 
for (var i = 0; i < 5; i += 1) { 
 
    // push the exact copy of original array 
 
    r.push(alph.slice()); 
 
} 
 

 
r[0].reverse(); 
 
console.log(r);

4

Sie sind nicht eine Reihe von neuen Arrays erstellen, wenn Sie push auf r: Sie haben die gleiche Anordnung auf r 5-mal drücken sind (es durch Verweis übergeben wird ist, nicht nach Wert). Daher aktualisiert jede Operation unter r[0] wirklich alph, wodurch auch alle anderen Referenzen aktualisiert werden.

0

Nun eigentlich können Sie Slice-Methode wie @Pranav C Balan vorgeschlagen, aber das wird fehlschlagen, wenn das Array multidimensional ist. Sie benötigen etwas wie Array.prototype.clone(), um die Funktionalität zu sichern. Machen wir das.

Array.prototype.clone = function(){ 
 
    return this.map(e => Array.isArray(e) ? e.clone() : e); 
 
}; 
 

 
var alph = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 ], 5 ], 
 
    cloned = [], 
 
    sliced = []; 
 
for(var i = 0; i < 5; i += 1) { 
 
    cloned.push(alph.clone()); 
 
    sliced.push(alph.slice()); 
 
} 
 

 
cloned[0][4][2].reverse(); // only the array at index pos 0,4,2 gets reversed 
 
sliced[0][4][2].reverse(); // all sub arrays at index 4,2 get reversed 
 
console.log(JSON.stringify(cloned)); 
 
console.log(JSON.stringify(sliced));

Verwandte Themen