2016-02-11 29 views
7

Ben_.clone lodash çalışmıyor mu?

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

Şimdi config.default_req.data orijinal ile herhangi bir bağı kaybederek sadece nesneyi kopyalamak gerekiyordu ?, ben lodash ile klonlama gerektiğini düşündük 'bar', eşittir var!

Bir nesneyi node.js içinde gerçekten kopyalamak/kopyalamak hakkında herhangi bir fikrin var mı? Bu sorunun basit bir klon/kopyalama fonksiyonuna alacak olanlar için : (v.0.10.40)

Düzenleme

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

cevap

13

Bu clone çünkü sığ kopyasıdır. cloneDeep kullanıyor olmalısınız. Referans burada

Kontrol: https://lodash.com/docs#cloneDeep

sığ kopya yalnızca nesnenin her bir özelliğinin veriler üzerinde kopyalar. Yani diziler ve nesneler referans ile geçirilir. Sığ bir kopya nispeten hızlıdır. Öte yandan derin bir kopya, özünde ağaçtan aşağıya doğru gider, böylece nesneler ve diziler yeni örneklerdir. Derin kopyalar nispeten yavaştır, bu nedenle ihtiyaç duyulmadıkça bunları kullanmaktan yorulun.

Burada Turp içinde bunu kontrol edebilirsiniz: https://jsfiddle.net/qqnved24/2/

uğraşırken deneyin:

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)