Javascript深度复制对象

Mat*_*zzi 33 javascript object

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

我有一个像这样的对象:

User = {    
  name: "user",
  settings: {
    first: "1",
    second: "2"    
  }    
}
Run Code Online (Sandbox Code Playgroud)

第二个:

user1 = {
  name: "user1",
  settings: {
    second: "3"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

    for(var key in user1){
        User[key] = user1[key];
    }
Run Code Online (Sandbox Code Playgroud)

结果用户将是:

User = {
  name: "user1",
  settings: {
    second: "3"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*zzi 15

我发现最好的方法是:

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);
Run Code Online (Sandbox Code Playgroud)

那这个呢?

    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];
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

  • 数组(嵌套对象)怎么样? (2认同)

Jon*_*ues 5

抓住了 jQuery 的扩展方法,并使它与库无关。

要点:jQuery 扩展的库不可知版本

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

免责声明:我没有对此进行广泛的测试。它基本上是 jQuery 的扩展()的 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);
Run Code Online (Sandbox Code Playgroud)

请参阅此处获取更多文档