2011-07-08 125 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']);