javascript深度复制对象

Javascript deep copying object

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the most efficient way to clone a JavaScript object?

我有一个这样的物体:

1
2
3
4
5
6
7
User = {    
  name:"user",
  settings: {
    first:"1",
    second:"2"    
  }    
}

第二个是:

1
2
3
4
5
6
user1 = {
  name:"user1",
  settings: {
    second:"3"
  }
}

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

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

结果用户将是:

1
2
3
4
5
6
User = {
  name:"user1",
  settings: {
    second:"3"
  }
}

已完全替换user.settings,而我只希望替换settings.second。

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


我发现最好的方法是:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);

这个怎么样?

1
2
3
4
5
6
7
8
9
    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];
            }
        }
    };


抓取jquery的extend方法,使其不可知库。

gist:jquery扩展的不可知库版本

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

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

像这样使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);

有关更多文档,请参阅此处


这真是太老套了,但这应该管用。我建议按照其他用户在评论中的建议进行操作;找到一个预先存在的库,可以为您完成这项工作。

1
2
3
4
5
6
7
8
9
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];
      }
   }
}