如何在JQuery中复制/克隆散列/对象?

at.*_*at. 37 javascript jquery clone copy javascript-objects

我在Javascript中有一个简单的对象(或哈希):

var settings = {
  link: 'http://example.com',
  photo: 'http://photos.com/me.jpg'
};
Run Code Online (Sandbox Code Playgroud)

我需要它的副本.是否有一种settings.clone()类型方法会给我另一个具有相同属性的对象?我正在使用jQuery,很高兴使用jQuery实用程序方法(如果存在).

pim*_*vdb 61

是的,用原始对象扩展一个空对象; 这样,一切都将被复制:

var clone = $.extend({}, settings);
Run Code Online (Sandbox Code Playgroud)

用另一个扩展一些填充的对象,例如:

$.extend({a:1}, {b:2})
Run Code Online (Sandbox Code Playgroud)

将返回:

{a:1, b:2}
Run Code Online (Sandbox Code Playgroud)

使用相同的逻辑:

$.extend({}, {foo:'bar', test:123})
Run Code Online (Sandbox Code Playgroud)

将返回:

{foo:'bar', test:123}
Run Code Online (Sandbox Code Playgroud)

即有效地克隆.

  • 不正确; 包含的对象仍然通过引用传递,而不是深度克隆,例如a = {aa:{aaa:3}}; b = $ extend({},a}; a.aa.aaa = 4; b.aa.aaa == 4 !! (4认同)
  • @BerryTsakala:从JQuery 1.1.4开始,您可以使用[`extend(true,...)`](https://api.jquery.com/jQuery.extend/#jQuery-extend-deep-target-object1-objectN )创建深层副本. (3认同)

Pan*_*lis 32

以非jQuery的方式.

var newObj = {};

Object.keys(settings).forEach(function(key) {
     newObj[ key ] = settings[ key ];
}); 
Run Code Online (Sandbox Code Playgroud)

这仅复制顶级属性.要将具有嵌套对象的哈希值复制为属性值,您需要使用递归函数.

注:Object.keys(settings)避免调用的需要settings.hasOwnProperty(key).

  • +1只是为了确保,`hasOwnProperty`将是一个很好的补充.(明天+1,因为我达到了投票限制:)) (4认同)