2012-05-20 51 views
0

考虑下面的代码如何在JavaScript中处理没有副作用的JSON数据?

var myData = {name: 'John'}; 

function fixName(data) { 
    var newData = data; 
    newData.name = 'Mike'; 
    return newData; 
} 

var myData2 = fixName(myData); 
console.log(myData2.name); 
console.log(myData.name); 

“迈克”,是因为在我的功能,newData和myData的指向同一件事打印两次。我如何改变我的功能,使其对myData没有副作用?这意味着节目应该打印'迈克',然后'约翰'。

回答

1

您需要克隆该数据对象。

什么是克隆对象的回答here

// jQuery 
newData = $.extend({}, data); 
2

所以基本上你想创建一个对象的副本,而不是获取参考?

如果是这种情况,你可能会对this question感兴趣,其中接受的答案使用一个简单的jQuery来做到这一点。

如果像我一样,你不想使用jQuery,你可以使用一个循环得到一个基本的副本:

var myData2 = {}; 
for(var x in myData) if(myData.hasOwnProperty(x)) myData2[x] = myData[x]; 
// Copied! 

这实际上是足够的,这只是被用来作为任何对象一个关联数组(像你的那样,并且和大多数JSON对象一样)。

4

您可能需要采取look at this answer有关“克隆”的对象的解释(这是非常复杂的),或采取简单的方法,并使用由J.Resig自己提供jQuery extend这在技术上这个抽象克隆的代码放到一个简单语法

1

克隆myData的最佳途径,你可以使用JSON.parse(JSON.stringify(myData))

var myData = {name: 'John'}; 

function fixName(data) { 
    var newData = data; 
    newData.name = 'Mike'; 
    return newData; 
} 

var myData2 = fixName(JSON.parse(JSON.stringify(myData))); 
console.log(myData2.name); //=> Mike 
console.log(myData.name); //=> John 

这将克隆嵌套的对象也顺便说一下。

这可能是一个想法,做一个函数出来的:

function cloneObj(obj,reviver){ 
    return JSON.parse(JSON.stringify(obj),reviver); 
} 

reviver可用于在对象操纵数据,你的情况,这将使fixName过时。

var myData2 = cloneObj(myData, function(k,v){return k === 'name' ? 'Mike' : v;});