2016-02-11 26 views
7

mam_.clone w lodash nie działa?

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

Teraz config.default_req.data równa „bar”, dlaczego ?, myślałem klonowania z lodash ma po prostu skopiować obiekt, tracąc dowolny link do oryginalnego!

Każdy pomysł, jak naprawdę klonować/kopiować obiekt w pliku node.js? (V.0.10.40)

Edit: Dla tych, którzy dostaną się do tej kwestii, prostej funkcji clone/kopiowania:

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

Odpowiedz

13

To dlatego clone jest płytkie kopia. Powinieneś używać cloneDeep.

Sprawdź tutaj referencyjny: https://lodash.com/docs#cloneDeep

Płytkie kopia będzie kopiować tylko na danych dotyczących poszczególnych właściwości obiektu. Więc tablice i obiekty są przekazywane przez odniesienie. Płytka kopia jest stosunkowo szybka. Z drugiej strony głęboka kopia rekurencyjnie przechodzi w dół drzewa, więc obiekty i tablice są nowymi instancjami. Głębokie kopie są stosunkowo powolne, więc bądźcie zmęczeni ich używaniem, chyba że jest to konieczne.

Można to sprawdzić w ryba tutaj: https://jsfiddle.net/qqnved24/2/

Spróbuj zabawy z następujących czynności:

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)