如何在 JQuery 中复制/克隆哈希/对象?
我有一个简单的 Javascript 对象(或哈希):
var settings = {
link: 'http://example.com',
photo: 'http://photos.com/me.jpg'
};
我需要它的副本。是否有一个 settings.clone()
类型的方法可以给我另一个具有相同属性的对象?我正在使用 jQuery,很高兴使用 jQuery 实用方法(如果存在)。
I have a simple object (or hash) in Javascript:
var settings = {
link: 'http://example.com',
photo: 'http://photos.com/me.jpg'
};
I need a copy of it. Is there a settings.clone()
type method that will give me another object with the same attributes? I'm using jQuery, so happy to use a jQuery utility method if one exists.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
是的,用原始对象扩展一个空对象;这样,所有内容都将被简单地复制:
用另一个填充对象扩展,例如:
将返回:
具有相同的逻辑:
将返回:
即有效的克隆。
Yes, extend an empty object with the original one; that way, everything will simply be copied:
Extending some filled object with another, e.g.:
will return:
With the same logic:
will return:
i.e. effectively a clone.
以非 jQuery 的方式。
这仅复制顶级属性。要将嵌套对象的哈希值复制为属性值,您将需要使用递归函数。
注意:
Object.keys(settings)
避免了调用settings.hasOwnProperty(key)
的需要。In a non jQuery way.
This copies only the top-level properties. To copy hashes with nested objects as property values, you will need to use a recursive function.
NB: The
Object.keys(settings)
avoids the need for callingsettings.hasOwnProperty(key)
.将第一个参数设置为 true。
编辑:第一个参数
true
表示深度复制。对于原始问题中的给定示例,不需要深层复制,因为存在简单的不可变键值对。对于标题中的问题 - 作为一般情况 - 使用深层复制。否则你会得到半份副本。Set first argument to true.
EDIT: First argument
true
signifies deep copy. For given example in original question there is no need for deep copy since there are simple immutable key-value pairs. For question in title - as a general case - use deep copy. Otherwise you get half-copy.听起来你想要 jQuery 扩展,它可以为你复制一个对象。
http://api.jquery.com/jQuery.extend/
It sounds like you want jQuery extend, which can copy an object for you.
http://api.jquery.com/jQuery.extend/
我的 2 美分:
它可能不是最优化的选项,但对于某些场景来说它可能很方便。
My 2 cents:
It may not be the most optimized option but it can be handy for some scenarios.
如果您不使用 jQuery,Underscore.js 还有一个扩展函数:
Underscore.js also has an extend function if you are not using jQuery: