2013-08-21 15 views
129

Ho scritto un quick jsfiddle here, dove ho passato un piccolo oggetto json a una nuova variabile e modificato i dati dalla variabile originale (non la nuova variabile), ma anche i dati della nuova variabile vengono aggiornati. Questo deve significare che l'oggetto JSON è stato passato per riferimento, giusto? ciCome copiare l'oggetto JavaScript nella nuova variabile NON come riferimento?

var json_original = {one:'one', two:'two'} 

var json_new = json_original; 

console.log(json_original); //one, two 
console.log(json_new); //one, two 

json_original.one = 'two'; 
json_original.two = 'one'; 

console.log(json_original); //two, one 
console.log(json_new); //two, one 

è un modo per fare una copia completa di un oggetto JSON in modo che modificando la variabile originale non modificherà la nuova variabile:

Ecco il mio codice veloce?

+22

Non c'è JSON lì. Si prega di non confondere gli oggetti JavaScript con JSON. – Quentin

+0

@Quentin, grazie, leggerò la differenza tra gli oggetti javacript e json (ref: http://stackoverflow.com/questions/6489783/whats-the-difference-between-javascript-object-and-json-object – Prusprus

+0

Non pensare che sia un duplicato, la risposta non è stata trovata sull'altro thread. – Prusprus

risposta

194

Ho trovato che il seguente funziona se non si utilizza jQuery e interessa solo la clonazione di oggetti semplici (vedere i commenti).

JSON.parse(JSON.stringify(json_original)); 
+14

Non funziona per funzioni, solo proprietà (variabili) all'interno di un oggetto . – Harold

+5

'JSON.stringify ({chiave: undefined}) // =>" {} "' –

+0

Questo ha funzionato a meraviglia per me dopo aver riscontrato problemi con l'uso della tecnica "jQuery.extend". – Kiee

89

L'unica opzione è quella di clonare in qualche modo l'oggetto.

Vedere this stackoverflow question su come ottenere questo risultato.

Per semplici oggetti JSON, il modo più semplice potrebbe essere:

var newObject = JSON.parse(JSON.stringify(oldObject)); 

se si utilizza jQuery, si può usare:

// Shallow copy 
var newObject = jQuery.extend({}, oldObject); 

// Deep copy 
var newObject = jQuery.extend(true, {}, oldObject); 

UPDATE 2017: Devo dire, dal momento che questo è un popolare risposta, che ci sono modi migliori per ottenere questo utilizzando le nuove versioni di javascript:

In ES6 o TypeScript (2.1+):

var shallowCopy = { ...oldObject }; 

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" }; 

Si noti che se "extraProp" è anche una proprietà su oldObject, il suo valore non verrà utilizzato perché extraProp: "abc" viene specificato più avanti nell'espressione, che essenzialmente lo sostituisce. Ovviamente, oldObject non verrà modificato.

Problemi correlati