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

时间:2011-08-18 20:40:02

标签: javascript jquery copy clone javascript-objects

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

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

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

6 个答案:

答案 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扩展,它可以为你复制一个对象。

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

答案 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;
}

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

相关问题