2016-06-10 7 views
4

es soll Array.slice() lassen Sie mich eine Kopie eines Arrays erstellen, und dann kann ich diese Kopie ändern, ohne das ursprüngliche Array zu ändern, aber wenn ich Verwenden Sie Array.forEach() über die Kopie zum Löschen einiger Werte, diese Werte werden auch aus dem ursprünglichen Array entfernt. Hat jemand eine Idee, warum das passiert? Hier ist der Code, den ich verwendet habe:Array.forEach() und Array.slice() zusammen funktioniert nicht

var originalArray = [ 
    { id: 1, name: 'Sales', datasources: [ 
     { id:1 , name: 'datasource1', fields: [] }, 
     { id:2 , name: 'datasource2', fields: [] }, 
    ] }, 
    { id: 4, name: 'Accounts', datasources: [ 
     { id:3 , name: 'datasource3', fields: [] }, 
     { id:4 , name: 'datasource4', fields: [] }, 
    ] }, 
    { id: 123, name: 'my datasources', datasources: [ 
     { id:1 , name: 'datasource1', fields: [] }, 
     { id:2 , name: 'datasource2', fields: [] }, 
     { id:3 , name: 'datasource3', fields: [] }, 
     { id:4 , name: 'datasource4', fields: [] }, 
    ] }, 
    { id: 12, name: 'shared datasources', datasources: [ 
     { id:13 , name: 'myshared datasource', fields: [] }, 
     { id:16 , name: 'hello test', fields: [] }, 
    ] }, 
]; 

var copyOfOriginalArray = originalArray.slice(); 

copyOfOriginalArray.forEach((folder, index) => { 
    folder.datasources = folder.datasources.filter((o) => { return o.name.trim().toLowerCase().includes('hello'); }); 
}); 

JSON.stringify(originalArray); 
JSON.stringify(copyOfOriginalArray); 
+0

„Für Objektreferenzen (und nicht das eigentliche Objekt), in Scheiben schneiden Kopien Referenzen in das neue Array-Objekt Sowohl die ursprüngliche und die neue Array sich auf dasselbe Objekt beziehen. Wenn sich ein referenziertes Objekt ändert, sind die Änderungen für das neue und das ursprüngliche Array sichtbar. " aus der MDN-Dokumentation von Array.prototype.slice() –

Antwort

5

des Lodash etwas klonen zu this definition Acording. Die slice() -Methode gibt eine seichte Kopie eines Teils eines Arrays in ein neues Array-Objekt zurück.

Flache Kopie ist eine bitweise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine genaue Kopie der Werte im ursprünglichen Objekt enthält. Wenn eines der Felder des Objekts Verweise auf andere Objekte sind, werden nur die Referenzadressen kopiert, d.h. nur die Speicheradresse wird kopiert.

für tiefe Kopieren jedes Objekt in Javascript Sie diese Funktion nutzen zu können.

function deepCopy(oldObj) { 
    var newObj = oldObj; 
    if (oldObj && typeof oldObj === 'object') { 
     newObj = Object.prototype.toString.call(oldObj) === "[object Array]" ? [] : {}; 
     for (var i in oldObj) { 
      newObj[i] = deepCopy(oldObj[i]); 
     } 
    } 
    return newObj; 
} 
+1

vielen Dank Ich bin darüber mit einigen Funktionen verwirrt worden, aber das ist hilfreich –

4

Scheibe wird eine Kopie des Arrays erstellen selbst, sondern es werden die Objekte im Array nicht klonen (die noch Verweise sein).

Sie müssen rekursiv Ihr Array und dessen Inhalt oder verwenden wie cloneDeep

Verwandte Themen