在javascript中克隆对象
下面的日志首先记录0,然后记录1。如何存储对象的副本,而不是对象的引用在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); 注意:以上是一个浅拷贝:任何嵌套对象或数
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]
中。如果您想要一个与原始对象完全分离的全新对象,则需要进行深度复制(第一个参数为passtrue
):
要阅读更多有关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);