2011-03-19 244 views
47

下面的第一个日志为0,然后是日志1.如何存储对象的副本,而不是对它的引用?在javascript中克隆对象

debug.log(vi.details.segment); 
vi.nextSegment = vi.details; 
vi.nextSegment.segment++; 
debug.log(vi.details.segment); 

回答

95

为了jQuery中克隆对象:

var vi.nextSegment = jQuery.extend({}, vi.details); 

注:上面是浅拷贝:任何嵌套的对象或阵列将通过参考被复制 - 这意味着你做出vi.nextSegment.obj[prop]任何更改将反映在vi.details.obj[prop]。如果你想要一个完全新的对象,它是完全从原来分开的,你需要做一个深拷贝(通过true作为第一个参数):

var vi.nextSegment = jQuery.extend(true, {}, vi.details); 

要更多扩展阅读起来,看here.

+9

这不是一个深层复制。 'var a = {b:[1,2]}; $ .extend({},a).b [0] ='test';'和'a.b [0]'将被更改为'test'。要进行深层复制,请将'true'作为第一个参数:'$ .extend(true,{},a);' – Reid 2011-03-19 20:25:22

+0

我忘记了包含深层复制,我只是编辑了我的答案。 – 2011-03-19 20:26:31

+4

刚刚得到我的一个gothcha:'jQuery.extend(true,{},obj);'会创建一个副本。 'jQuery.extend(true,obj,{});'不会。 – worldsayshi 2013-04-21 21:41:16

7

找到这个工作更好地为我克隆使用jQuery “parseJSON()” 的对象和 “JSON.stringify()”

$.ajax({ 
    url: 'ajax/test.html', 
    dataType: 'json', 
    success: function(data) { 
    var objY = $.parseJSON(JSON.stringify(data)); 
    var objX = $.parseJSON(JSON.stringify(data)); 
    } 
}); 

克隆数据对象在objX & objY是两个不同的对象,你不必搞乱“参考”的问题

Gracias!

+0

我喜欢这个:0) – kiranvj 2015-05-11 20:06:55

+0

你可以做到这一点没有jquery 使用JSON.parse内置方法 – MarkosyanArtur 2017-03-24 04:12:24

1

这是我的元素复制几次:

首先我有一个模板:

<div class="forms-container"> 
    <div class="form-template"> 
     First Name <input> 
     .. a lot of other data ... 
     Last Name <input> 
    <div> 
    <button onclick="add_another();">Add another!</button> 
<div> 

现在,JavaScript的:

function add_another(){ 
    jQuery(".form-template").clone().appendTo(".forms-container"); 
} 
4

另一种方式来克隆对象

newObj = JSON.parse(JSON.stringify(oldObj)); 

但要小心,如果它包含日期。在这种情况下,JSON.parse将返回date.toString()而不是日期。

0

尝试Immutable.js

由于jQuery主要涉及DOM Elements,它可能不是这份工作的合适工具。 Immutable.js是由Facebook创建的56 kb (minified)库。

// roughly implementing 
import Immutable from 'immutable' 
// 
const oldObj = { foo: 'bar', bar: 'baz' } 
// create a map from the oldObj and then convert it to JS Object 
const newObj = Immutable.Map(oldObj).toJS() 

这样你会有效地oldObj克隆newObj。基本上,如果您没有Map,那么我们首先需要创建一个Map。地图就像我们用来创建copiesblue-print

参考文献:

首页 -Immutable

文档 -Immutable Docs

GitHub的 -[email protected]

好运。