将对象属性复制到新对象属性 - 而不是通过引用

Copy object properties to a new one - not by reference

本文关键字:对象 属性 引用 复制 新对象      更新时间:2023-09-26

我有一个JavaScript对象数组,它用一些值初始化。我想将这些值复制到一个新的对象数组中,但不引用原始对象,这样我就可以操作新对象。

我尝试了objectOptions.concat()像此示例代码中一样的方法,但它随后也删除了引用的原始对象:

var objectOptions = [{option1: 'value1', someOption: 'value2'}];
function objectClean(){
    var newObjectOptions = objectOptions.concat();
    for(var i in newObjectOptions ) {
        delete newObjectOptions[i]['someOption'];
    }
    return newObjectOptions ;
};

如果你的对象足够简单并且与 JSON 兼容(即,只包含对象、数组和原语,没有 DOM 引用,没有正则表达式对象,没有循环引用等),最简单的克隆方法是:

var clone = JSON.parse(JSON.stringify(original));

否则,您将需要一个深度复制函数,就像这个答案*上找到的那样:

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var temp = obj.constructor(); // changed
    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

*小心!这个问题的公认答案是仅限jQuery的解决方案,而且被严重高估了!

var copyme = {/*object with properties which are to be copied in another object*/};
var copy = {};
for (var attr in copyme) {
  if (copyme.hasOwnProperty(attr)) copy[attr] = clone(copyme[attr]);
}