复制Javascript对象属性
我有一个来自服务器的对象,其中有多个属性,我想将其水合为一个新对象,更改一个属性的名称,并保留其余属性 代码: JSON:复制Javascript对象属性,javascript,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.
{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;
我所做的就是基于此,试图将一些json解析为一种格式,要求我更改1属性的名称。对于这种简单的情况,您可以执行以下操作:
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;
对于具有大量字段的更复杂对象,您可能更喜欢以下内容:
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;
我真的不明白你的问题,但这是我从现有对象提取时通常做的:
var newObj = new Object(jsonObj);
alert(newObj.UserId === jsonObj.UserId); //returns true
这就是你要问的吗?希望对您有所帮助。如果您只想复制特定字段
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;
}
/**
* 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']);
/**
*返回仅复制了指定字段的新对象。
*
*@param{Object}要从中复制字段的原始对象
*@param{Array}要在新对象中复制的字段名列表
*@return{Object}仅复制了指定字段的新对象
*/
var copyObjectFields=函数(originObject,fieldNamesArray)
{
var obj={};
如果(fieldNamesArray==null)
返回obj;
对于(变量i=0;i
我更喜欢重用而不是重新创建,因此我建议使用Object.assign
使用JSON.parse和JSON.stringify;
重复:是的,aroth是对的。使用jquery parseJSON方法将json解析为json对象。您有一个很好的问题朋友,但它隐藏在注释框的第3行深处。还有,我可能是错的,但看起来你不是在合并属性,只是在复制到一个新对象。我将更改页眉+1个漂亮的提示。可以肯定的是,JS不是我的主要语言,
newObj
\u将是jsonObj的一个副本,而不是一个在jsonObj中更改值不会影响newObj?的引用。。我本该把这个拉小提琴的,但我太懒了。heh:)它将是一个副本,并且您总是使用newObj.Id访问读/写属性。如果您使用.prototype更改属性,那么它将更改基类中的值:)我喜欢这个简洁的解决方案,但它附带了一个重要的警告:newObj
和jsonObj
将引用相同的对象。因此,在一个字段中更改字段会导致在另一个字段中出现相同的更改。这里有一个例子来演示这一点:@aroth Nice demo。那么,做深度复制的方法是什么呢?是assign
?我投了否决票,因为代码是浅拷贝,而不是OP可能想要的嘿,很好。这个函数是“深度复制”吗?它可以处理jsonObj设置为属性的内部对象吗?@stefgosselin-不,它不是一个合适的深度复制实现。这需要通过对象中的任何数组
和对象
字段进行递归。如果要复制的对象包含任何此类字段,则此方法仅创建嵌套对象/数组的浅层副本。