首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript深拷贝对象

Javascript深拷贝对象
EN

Stack Overflow用户
提问于 2012-07-02 18:37:52
回答 3查看 32.6K关注 0票数 41

可能重复: 克隆JavaScript对象的最有效方法是什么?

我有一个这样的物体:

代码语言:javascript
复制
User = {    
  name: "user",
  settings: {
    first: "1",
    second: "2"    
  }    
}

还有第二个:

代码语言:javascript
复制
user1 = {
  name: "user1",
  settings: {
    second: "3"
  }
}

现在,我希望将User 1的自定义值复制到用户中,使用:

代码语言:javascript
复制
    for(var key in user1){
        User[key] = user1[key];
    }

结果用户将是:

代码语言:javascript
复制
User = {
  name: "user1",
  settings: {
    second: "3"
  }
}

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

如何实现这一点,而不知道主对象有多少子对象?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-03 12:45:15

我发现最好的方法是:

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

代码语言: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);

那这个呢?

代码语言:javascript
复制
    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];
            }
        }
    };
票数 17
EN

Stack Overflow用户

发布于 2012-07-03 00:41:13

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

要点:与库无关的jQuery扩展版本

它封装在扩展构造函数中,所以每次调用extend方法时都不必实例化它的所有内部方法。

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

像这样用它。

代码语言:javascript
复制
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);

有关更多文档,请参见这里。

票数 5
EN

Stack Overflow用户

发布于 2012-07-02 19:20:00

这真是太麻烦了,但这应该管用。我建议按照其他用户在评论中的建议去做;找到一个预先存在的库来帮助您这样做。

代码语言:javascript
复制
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];
      }
   }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11299284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档