2016-02-11 10 views
7

Ich habe_.klon in lodash funktioniert nicht?

config.default_req = { foo: 'foo' } 
this.default_req = _.clone(config.default_req); 
this.default_req.body.data = 'bar'; 

Jetzt config.default_req.data auf ‚bar‘ gleich, warum ?, dachte ich mit lodash Klonen sollte das Objekt nur kopieren, einen Link auf das Original zu verlieren!

Irgendeine Idee, wie man wirklich ein Objekt in node.js klont/kopiert? (V.0.10.40)

Edit: Für diejenigen, die auf diese Frage zu bekommen, eine einfache Klon/Kopierfunktion:

var clone = function(source){ 
    return JSON.parse(JSON.stringify(source)); 
}; 

Antwort

13

Dies, weil clone ist flache Kopie. Sie sollten cloneDeep verwenden.

Überprüfen Sie die Referenz hier: https://lodash.com/docs#cloneDeep

Eine flache Kopie wird nur über Daten auf jeder Eigenschaft des Objekts kopieren. Daher werden Arrays und Objekte als Referenz übergeben. Eine flache Kopie ist relativ schnell. Eine tiefe Kopie geht dagegen rekursiv in den Baum, so dass Objekte und Arrays neue Instanzen sind. Tiefe Kopien sind relativ langsam, also sollten Sie sie nur benutzen, wenn sie nicht benötigt werden.

Sie können es in einer Geige hier ansehen: https://jsfiddle.net/qqnved24/2/

Versuchen um so mit der folgenden:

var myObj = { 
    arr: [1, 2, 3], 
    obj: { 
    first: 'foo' 
    } 
} 

var myDeepClone = _.cloneDeep(myObj) 
var myShallowClone = _.clone(myObj) 

//Should ONLY change array slot 1 on my Clone 
myDeepClone.arr[1] = 99 

console.log(' ==== Checking Deep Clone Array ==== ') 
console.log(myObj) 
console.log(' -- Deep Clone Below --'); 
console.log(myDeepClone) 


console.log('\n\n') 

// Danger: Will change the 'first' property on both the shallow copy and the original 
myShallowClone.obj.first = 'bar'; 

console.log(' ==== Checking Shallow Clone Obj ==== ') 
console.log(myObj) 
console.log(' -- Shallow Clone Below --'); 
console.log(myShallowClone); 

console.log('\n\n') 

// Should only change the 'first property' on the Deep Cloned Obj 
myDeepClone.obj.first= 'myObj'; 

console.log(' ==== Checking Deep Clone Obj ==== ') 
console.log(myObj) 
console.log(' -- Deep Clone Below --'); 
console.log(myDeepClone) 

console.log('\n\n') 

// Danger will alter Shallow clones OBJ 
myObj.obj.meaningOfLife = 42; 
console.log(' ==== Mutating Original Obj ==== ') 
console.log(myObj) 
console.log(' -- Shallow Clone Below --'); 
console.log(myShallowClone) 
console.log(' -- Deep Clone Below --'); 
console.log(myDeepClone)