如何在 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 中复制/克隆哈希/对象?的主要内容,如果未能解决你的问题,请参考以下文章
在 jQuery UI 中克隆可拖动对象时,如何将数据和事件传输到新元素?