2017-02-21 46 views
0

我需要帮助理解JSON的行为[参考问题]。更新JavaScript中的JSON数据时的参考问题

var obj = {"newData":["Hello"]}; 

obj["oldData"] = obj.newData; 
// Here added new key "oldData" 
// Expected output is coming: {"newData":["Hello"],"oldData":["Hello"]} 

obj["newData"].push("hi"); 
// On updating "newData" 
// Excepted Output     : {"newData":["Hello","hi"],"oldData":["Hello"]} 
// But Actual Output is coming as : {"newData":["Hello","hi"],"oldData":["Hello","hi"]} 

如何解决这个问题。 如何避免更新oldData字段。 jsfiddle example

同样的问题,使用对象,jsfiddle example for objects

回答

1

通过创建您newData阵列参考obj["oldData"] = obj.newData;所以newData的每一个变化都会影响oldData阵列。改为使用obj["oldData"] = obj.newData.slice();来创建一个数组的克隆,以便有两个不同的数组。

+0

什么,如果有一个对象instaed阵列 –

+0

,那么你就不能在你的示例中使用'.push',我们在这种情况下考虑数组。 –

+0

@DiveshOswal关键是你需要复制它,以避免参考问题,复制的方式将取决于它是什么.. – Kaddath

0

您可以使用newData = Object.assign({}, oldData); 和改动后的任何newDate的财产不吓唬改变oldDate一样的...

0
var obj = {"newData":["Hello"]}; 

obj["oldData"] = obj.newData.concat(); //make copy of array 

obj["newData"].push("hi"); 
+0

关心一些额外的解释(如问)?它究竟有什么帮助?你有没有考虑到['concat'返回一个浅拷贝](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)? – dakab