【问题标题】:Copy object properties to a new one - not by reference将对象属性复制到新的 - 不是通过引用
【发布时间】:2013-01-26 17:49:58
【问题描述】:

我有一个 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 ;
};

【问题讨论】:

  • 谢谢!我没有想到 jQuery,我正在尝试原生 Javascript 方法。它可以关闭。
  • 什么?不,不要使用 jQuery!哪里说要使用 jQuery?
  • 在您发布的问题的已接受答案中。我试过了,它很适合我想做的事情。
  • 该答案是由 jQuery 的创建者编写的,是的,如果您使用的是 jQuery,它可以工作。但是为此必须使用 jQuery 是无稽之谈(我猜这就是 @Nile 的意思)。这个问题和答案如此受欢迎,这很糟糕,因为人们会被误导,认为他们需要 jQuery 来克隆对象。不幸的是,有许多问题作为该问题的副本而关闭。

标签: javascript jquery


【解决方案1】:

如果您的对象足够简单并且JSON-compatible(即只包含对象、数组和基元,没有 DOM 引用、没有 Regex 对象、没有循环引用等),最简单的克隆方法是:

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

否则,您将需要一个深拷贝功能,例如 this answer* 上的那个:

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 的解决方案,并且被严重高估了!

【讨论】:

    【解决方案2】:
    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]);
    }
    

    【讨论】:

    • 问个问题,不要在cmets闲聊
    • 提问者有没有解释什么是 concat ?
    • 你的答案是理论上的,直到你可以通过解释它的工作原理来证明它是正确的。你研究过标记系统吗?我有证据手段来标记和否决你的答案。
    • 但是当我用正确的答案解释时,我可以保证我会得到支持:stackoverflow.com/questions/14505840/…stackoverflow.com/questions/14435426/…
    • 这意味着你同意新人在这里成长很困难,仅仅是因为有人不能用那么大的鼠标点击投票按钮。
    猜你喜欢
    • 2013-08-23
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2011-06-06
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多