2016-02-11 19 views
7

Ho_.clone in lodash non funziona?

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

Ora config.default_req.data uguale a 'bar', perché ?, ho pensato la clonazione con lodash si suppone basta copiare l'oggetto, perdendo qualsiasi collegamento a quella originale!

Qualche idea su come clonare/copiare un oggetto in node.js? (V.0.10.40)

Edit: Per chi arriva a questa domanda, una semplice funzione di clone/copia:

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

risposta

13

Questo perché clone è copia superficiale. Dovresti usare cloneDeep.

Verificare il riferimento qui: https://lodash.com/docs#cloneDeep

una copia copierà solo su dati su ogni proprietà dell'oggetto. Così gli array e gli oggetti vengono passati per riferimento. Una copia superficiale è relativamente veloce. D'altra parte una copia profonda scende ricorsivamente nell'albero, quindi gli oggetti e gli array sono nuove istanze. Le copie profonde sono relativamente lente, quindi sii stanco di usarle a meno che non sia necessario.

È possibile controllare fuori in un violino qui: https://jsfiddle.net/qqnved24/2/

Prova a giocare con il seguente:

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)