在javascript中克隆对象

在javascript中克隆对象,javascript,jquery,arrays,object,clone,Javascript,Jquery,Arrays,Object,Clone,下面的日志首先记录0,然后记录1。如何存储对象的副本,而不是对象的引用 debug.log(vi.details.segment); vi.nextSegment = vi.details; vi.nextSegment.segment++; debug.log(vi.details.segment); 要在jQuery中克隆对象,请执行以下操作: var vi.nextSegment = jQuery.extend({}, vi.details); 注意:以上是一个浅拷贝:任何嵌套对象或数

下面的日志首先记录0,然后记录1。如何存储对象的副本,而不是对象的引用

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

要在jQuery中克隆对象,请执行以下操作:

var vi.nextSegment = jQuery.extend({}, vi.details);
注意:以上是一个浅拷贝:任何嵌套对象或数组都将通过引用进行复制-这意味着您对
vi.nextSegment.obj[prop]
所做的任何更改都将反映在
vi.details.obj[prop]
中。如果您想要一个与原始对象完全分离的全新对象,则需要进行深度复制(第一个参数为pass
true
):

要阅读更多有关extend的信息,请参阅以下文章:

根据答复:


更多信息可以在

中找到,这对我使用jQuery“parseJSON()”和“JSON.stringify()”克隆对象更有效

在objX和objY中克隆数据对象是两个不同的对象,您不必处理“按引用”问题


格雷西亚斯

这就是我多次复制元素的方式:

首先,我有一个模板:

<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>

克隆对象的另一种方法是

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

请尝试
Immutable.js
: 由于
jQuery
主要处理
DOM元素
,因此它可能不是适合该作业的工具
Immutable.js
是一个
56kb(缩小版)
库,由
Facebook
创建

// 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
。地图就像一个
蓝图
,我们使用它来创建
副本

参考资料: 主页-

文档-

GitHub-


祝您好运。

如果您需要保留初始对象,但需要使用新选项覆盖数据,您可以使用第一个选项上的true将多个对象传递给$.extend(jQuery):

var opts_default = {opt1: true, opt2: false};
var opts_new = {opt1: false};
var opts_final = $.extend(true, {}, opts_default, opts_new);

那不是一个很深的副本<代码>变量a={b:[1,2]};$。extend({},a).b[0]='test'
a.b[0]
将更改为
“测试”
。要进行深度复制,请将
true
作为第一个参数:
$.extend(true,{},a)一个刚得到我的gothcha:
jQuery.extend(true,{},obj)将创建一个副本
jQuery.extend(true,obj,{})不会。@worldsayshi:我希望能早点看到你的评论。好几个星期都在头痛。非常感谢。太棒了,伙计们!正是我需要的!您可以在不使用jquery的情况下使用JSON.parse内置方法来实现这一点
function add_another(){
    jQuery(".form-template").clone().appendTo(".forms-container");
}
newObj = JSON.parse(JSON.stringify(oldObj));
// 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()
var opts_default = {opt1: true, opt2: false};
var opts_new = {opt1: false};
var opts_final = $.extend(true, {}, opts_default, opts_new);