【问题标题】:Javascript deep copying object [duplicate]Javascript深度复制对象[重复]
【发布时间】:2012-07-03 04:45:56
【问题描述】:

可能重复:
What is the most efficient way to clone a JavaScript object?

我有一个这样的对象:

User = {    
  name: "user",
  settings: {
    first: "1",
    second: "2"    
  }    
}

还有第二个:

user1 = {
  name: "user1",
  settings: {
    second: "3"
  }
}

现在我想将 user1 的自定义值复制到 User 中,使用:

    for(var key in user1){
        User[key] = user1[key];
    }

结果用户将是:

User = {
  name: "user1",
  settings: {
    second: "3"
  }
}

User.settings 已被完全替换,而我只想替换 settings.second。

如何在不知道主对象有多少子对象的情况下做到这一点?

【问题讨论】:

  • 使用递归?您是否搜索过深层 Object.copy 函数?
  • 由于 javascript 传递对象的方式(通过引用),深度复制嵌套对象实际上是一种考验。我会听从@Bergi 的建议并找到一个预先存在的。
  • "这个问题以前有人问过,已经有了答案。"所以我问版主,在哪里?以前在哪里问过?为什么要让用户去挖掘并找到它?
  • this implementation 会做这项工作吗?

标签: javascript object


【解决方案1】:

获取 jQuery 的 extend 方法,并使其与库无关。

要点:Library agnostic version of jQuery's Extend

它包含在一个 Extender 构造函数中,因此您不必实例化 每次调用extend方法时,它的所有内部方法。

免责声明:我没有对此进行广泛的测试。它基本上是 jQuery 的 extend() 的 1:1 克隆,但是你的里程可能会有所不同。

像这样使用它。

var user1 = {
  name: "user1",
  settings: {
    first: "1",
      second: {bar: 'foo'}
  }
};
var user2 = {
  name: "user2",
  settings: {
    second: {foo:'bar'}
  }
};

/* merge user1 into User */
__extend(true, user1, user2);

// Modifies the User object
user1.settings.second.foo == 'bar'; // true

// note, you can do assignment too.
var newUser = __extend(true, user1, user2);

See here for more documentation

【讨论】:

  • 这可能比其他解决方案更长,但它工作可靠,并且适用于数组和对象类型。谢谢!
  • 这在犀牛中帮助了我..干杯
【解决方案2】:

我发现最好的方法是:

http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/

Object.deepExtend = function(destination, source) {
  for (var property in source) {
    if (typeof source[property] === "object" &&
     source[property] !== null ) {
      destination[property] = destination[property] || {};
      arguments.callee(destination[property], source[property]);
    } else {
      destination[property] = source[property];
    }
  }
  return destination;
};


Object.extend(destination, source);

这个怎么样?

    function clone(destination, source) {
        for (var property in source) {
            if (typeof source[property] === "object" && source[property] !== null && destination[property]) { 
                clone(destination[property], source[property]);
            } else {
                destination[property] = source[property];
            }
        }
    };

【讨论】:

  • arguments.callee 已弃用。你真的应该使用命名函数。此外,您忘记了 hasOwnProperty,这是非常重要的。
  • 查看更新,是不是更好?
  • 是的,尽管您仍然从原型中复制属性。复制到目标对象确实应该称为“扩展”,而不是“克隆”(第一次尝试的“深度扩展”会更好)
  • 我的解决方案说明了所有这些;)加一会很好,至少。
  • 数组(嵌套对象)怎么样?
【解决方案3】:

这真的很hacky,但这应该可以。我建议按照其他用户在 cmets 中的建议进行操作;找到一个预先存在的库来为你做这件事。

for(var key in user1){  
   var temp = User[key]
   User[key] = user1[key];   
   for(var key1 in temp){
      if(User[key][key1] == null){
         User[key][key1] = temp[key1];
      }
   }
}

【讨论】:

猜你喜欢
  • 2015-05-06
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2011-09-02
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多