2012-05-20 86 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;});