2017-04-30 7 views
1

Ich würde erwarten, dass nach der Verwendung von distances.slice(), würde ich eine Kopie des Arrays haben. Aber wenn ich ein Element der neuen Kopie ändere, ändert es immer noch das ursprüngliche Array. Warum?Array-Kopie mit Slice funktioniert nicht

var distances = [ 
 
    ['-1', '10', '-1', '31'], 
 
    ['10', '-1', '10', '-1'], 
 
    ['-1', '-1', '-1', '10'], 
 
    ['15', '6', '-1', '-1'] 
 
]; 
 
for (var i = 0; i < 4; i++) { 
 
    console.log(distances, 'distances pairstop'); 
 
    var sampleDistance = distances.slice() 
 
    sampleDistance[0][2] = ['fooo'] 
 
}

+0

'slice' erstellt nur eine seichte Kopie – adeneo

Antwort

2

Scheibe erzeugt eine flache Kopie des Arrays. Es sagt, so in den docs:

Die Methode slice() eine flache Kopie eines Teils eines Array-Objekt in ein neues Array aus beginnt ausgewählt kehrt zum Ende (Ende nicht enthalten). Das ursprüngliche Array wird nicht geändert.

Da distances ist ein Array von arryas wird sampleDistance eine flache Kopie sein, was bedeutet, es refernces den gleichen 3 (one-dimentional) Arrays hält. sampleDistance[0][2] = ['fooo'] ändert das erste eindimensionale Array, das sowohl durch sampleDistance als auch distances referenziert wird.

daher Ihr Fehler.

+0

Um eine tiefe Kopie zu erstellen, können Sie' var sampleDistance = distances.map (x => x.slice()) 'verwenden –

0

Um ein Array mit Sub-Array-Elementen mit unbestimmter Tiefe zu klonen, benötigen Sie ein allgemeines Array-Cloning-Tool wie;

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

So distances.clone() sollte nur die Arbeit gut machen.