我在Javascript中有一个简单的对象(或哈希):
var settings = {
link: 'http://example.com',
photo: 'http://photos.com/me.jpg'
};
我需要一份副本。是否有settings.clone()
类型的方法会给我另一个具有相同属性的对象?我正在使用jQuery,很高兴使用jQuery实用程序方法(如果存在)。
答案 0 :(得分:61)
是的,extend一个空对象与原始对象;这样,一切都将被复制:
var clone = $.extend({}, settings);
将一些填充的对象扩展为另一个,例如:
$.extend({a:1}, {b:2})
将返回:
{a:1, b:2}
使用相同的逻辑:
$.extend({}, {foo:'bar', test:123})
将返回:
{foo:'bar', test:123}
即。实际上是一个克隆。
答案 1 :(得分:32)
以非jQuery的方式。
var newObj = {};
Object.keys(settings).forEach(function(key) {
newObj[ key ] = settings[ key ];
});
这仅复制顶级属性。要将具有嵌套对象的哈希值复制为属性值,您需要使用递归函数。
NB: Object.keys(settings)
无需拨打settings.hasOwnProperty(key)
。
答案 2 :(得分:4)
var clone = $.extend(true, {}, settings);
将第一个参数设为true。
编辑:第一个参数true
表示深层复制。对于原始问题中的给定示例,不需要深度复制,因为存在简单的不可变键值对。对于标题中的问题 - 作为一般情况 - 使用深层复制。否则你会得到半份副本。
答案 3 :(得分:2)
听起来你想要jQuery扩展,它可以为你复制一个对象。
答案 4 :(得分:1)
Underscore.js also has an extend function如果您不使用jQuery:
extend
_.extend(destination, *sources)
将源对象中的所有属性复制到目标对象,并且 返回目标对象。这是有序的,所以最后一个来源会 覆盖先前参数中同名的属性。_.extend({name: 'moe'}, {age: 50}); => {name: 'moe', age: 50}
答案 5 :(得分:1)
我的2美分:
function clone(hash) {
var json = JSON.stringify(hash);
var object = JSON.parse(json);
return object;
}
它可能不是最优化的选项,但在某些情况下它可以很方便。