Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制Javascript对象属性_Javascript - Fatal编程技术网

复制Javascript对象属性

复制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.

我有一个来自服务器的对象,其中有多个属性,我想将其水合为一个新对象,更改一个属性的名称,并保留其余属性

代码:

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;

我所做的就是基于此,试图将一些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-不,它不是一个合适的深度复制实现。这需要通过对象中的任何
数组
对象
字段进行递归。如果要复制的对象包含任何此类字段,则此方法仅创建嵌套对象/数组的浅层副本。