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]; } } } |