2011-07-08 164 views
7

我有一個對象來自服務器,其中有多個屬性,我想將它合併到一個新對象中,更改1個屬性的名稱並保留其餘部分。複製Javascript對象屬性

代碼:

JSON:{ UserId: 1, Name: "Woo", Age: 10 }

我想它的對象的格式:

var newObj = {} 
newObj.id = jsonObj.UserId; 
//Everything property below here is the same. How can i prevent writing this code? 
newObj.Name = jsonObj.Name; 
newObj.Age = jsonObj.Age; 

什麼我是在此基礎上做answer,試圖解析一些JSON轉換爲需要我更改1個屬性名稱的格式。

+0

你有什麼問題嗎? – Ibu

+0

重複:http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically –

+0

是aroth是正確的。並將json解析爲一個json對象jquery parseJSON方法。 – Neeraj

回答

15

對於這樣一個簡單的例子,你可以這樣做:

var newObj = {id: jsonObj.UserId, Name: jsonObj.Name, Age: jsonObj.Age}; 

對於具有大量的字段的更復雜的對象,你可能更喜歡這樣的:

//helper function to clone a given object instance 
function copyObject(obj) { 
    var newObj = {}; 
    for (var key in obj) { 
     //copy all the fields 
     newObj[key] = obj[key]; 
    } 

    return newObj; 
} 


//now manually make any desired modifications 
var newObj = copyObject(jsonObj); 
newObj.id = newObj.UserId; 
+0

這工作,非常感謝。 –

+0

嘿,很好。這個函數是「深度複製」,它是否與jsonObj設置爲屬性的內部對象一起工作? – stefgosselin

+0

@stefgosselin - 不,這不是一個適當的深層複製實現。這需要通過對象中的任何「Array」和「Object」字段進行遞歸。如果被複制的對象包含任何這樣的字段,則此方法僅創建嵌套對象/數組的淺表副本。 – aroth

1

真的不理解你的問題,但是這是我常做的時候我從現有對象中提取:

var newObj = new Object(jsonObj); 
alert(newObj.UserId === jsonObj.UserId); //returns true 

這就是你要求的嗎?希望有所幫助。

+0

+1好的提示。可以肯定的是,JS不是我的主要語言,'newObj' _將是jsonObj的副本,而不是引用,其中jsonObj中的值更改不會影響newObj? ..我應該用小提琴打這個,但太懶。 heh :) – stefgosselin

+0

它將是一個副本,並且您總是使用newObj.Id訪問讀/寫屬性。如果使用.prototype更改屬性,那麼它將更改基類中的值:) –

+3

我喜歡這個解決方案的簡潔性,但它帶有一個重要的警告:'newObj'和'jsonObj'將引用相同的目的。因此,改變一個領域導致相同的變化出現在另一個領域。以下是一個演示此示例的示例:http://jsfiddle.net/3JvAd/ – aroth

1
function clone(o) { 
if(!o || 'object' !== typeof o) { 
    return o; 
} 
var c = 'function' === typeof o.pop ? [] : {}; 
var p, v; 
for(p in o) { 
if(o.hasOwnProperty(p)) { 
    v = o[p]; 
    if(v && 'object' === typeof v) { 
    c[p] = clone(v); 
    } 
    else { 
    c[p] = v; 
    } 
} 
} 
return c; 
} 
3

如果你只想複製特定領域

/** 
    * Returns a new object with only specified fields copied. 
    * 
    * @param {Object} original object to copy fields from 
    * @param {Array} list of fields names to copy in the new object 
    * @return {Object} a new object with only specified fields copied 
    */ 
    var copyObjectFields = function (originObject, fieldNamesArray) 
    { 
     var obj = {}; 

     if (fieldNamesArray === null) 
      return obj; 

     for (var i = 0; i < fieldNamesArray.length; i++) { 
      obj[fieldNamesArray[i]] = originObject[fieldNamesArray[i]]; 
     } 

     return obj; 
    }; 


//example of method call 
var newObj = copyObjectFields (originalObject, ['field1','field2']);