如何在 JQuery 中复制/克隆哈希/对象?

Posted

技术标签:

【中文标题】如何在 JQuery 中复制/克隆哈希/对象?【英文标题】:How to copy/clone a hash/object in JQuery? 【发布时间】:2011-10-30 03:25:19 【问题描述】:

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

var settings = 
  link: 'http://example.com',
  photo: 'http://photos.com/me.jpg'
;

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

【问题讨论】:

Copying an Object in Javascript 的可能重复项 恕我直言,这应该重命名为“如何在 jquery 中复制/克隆哈希/对象”。那么它就会与上面的副本不同。 【参考方案1】:

是的,extend 一个空对象与原始对象;这样,所有内容都将被简单地复制:

var clone = $.extend(, settings);

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

$.extend(a:1, b:2)

将返回:

a:1, b:2

同理:

$.extend(, foo:'bar', test:123)

将返回:

foo:'bar', test:123

即实际上是一个克隆。

【讨论】:

不正确;包含的对象仍然通过引用传递,而不是深度克隆,例如a=aa:aaa:3; b=$extend(,a; a.aa.aaa=4; b.aa.aaa==4 !! @BerryTsakala:从 JQuery 1.1.4 开始,您可以使用 extend(true, ...) 创建深层副本。【参考方案2】:

以非 jQuery 方式。

var newObj = ;

Object.keys(settings).forEach(function(key) 
     newObj[ key ] = settings[ key ];
); 

这仅复制***属性。要将嵌套对象的散列复制为属性值,您将需要使用递归函数。

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

【讨论】:

+1 只是为了确保,hasOwnProperty 将是一个很好的补充。 (明天我达到投票上限时+1 :)) 我修改了代码,不再需要hasOwnProperty【参考方案3】:
var clone = $.extend(true, , settings);

将第一个参数设置为 true。

编辑:第一个参数true 表示深拷贝。对于原始问题中的给定示例,由于存在简单的不可变键值对,因此不需要深拷贝。对于标题中的问题 - 作为一般情况 - 使用深拷贝。否则你会得到一半的副本。

【讨论】:

如果你想要一个深拷贝,你只需要true【参考方案4】:

听起来你想要 jQuery 扩展,它可以为你复制一个对象。

http://api.jquery.com/jQuery.extend/

【讨论】:

【参考方案5】:

我的 2 美分:

function clone(hash) 
  var json = JSON.stringify(hash);
  var object = JSON.parse(json);

  return object;

它可能不是最优化的选项,但在某些情况下它可以很方便。

【讨论】:

对于大多数用途来说,这非常好..但它会错过以undefined为值的键【参考方案6】:

Underscore.js also has an extend function 如果你没有使用 jQuery:

extend _.extend(destination, *sources) 将源对象中的所有属性复制到目标对象,然后 返回目标对象。它是有序的,所以最后一个来源将 覆盖先前参数中的同名属性。

_.extend(name: 'moe', age: 50);
=> name: 'moe', age: 50

【讨论】:

或者更具表现力:var new_obj = _.clone( old_obj );

以上是关于如何在 JQuery 中复制/克隆哈希/对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 Map 并克隆每个值? [复制]

如何使用 JQuery 将相同的输入值克隆到其他输入?

在java中,如何复制一个对象?比如说string对象

在 jQuery UI 中克隆可拖动对象时,如何将数据和事件传输到新元素?

克隆 JavaScript 对象时如何排除键列表? [复制]

jQuery - 结合克隆内容和淡入