在javascript中克隆一个对象

时间:2011-03-19 20:19:47

标签: javascript jquery arrays object clone

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

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

7 个答案:

答案 0 :(得分:127)

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

答案 1 :(得分:30)

查看帖子:What is the most efficient way to clone a javascript object

根据John Resig's回答:

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

可以在jQuery documentation.

中找到更多信息

答案 2 :(得分:8)

这对我使用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是两个不同的对象,你不必搞乱“引用”问题

格拉西亚斯!

答案 3 :(得分:6)

克隆对象的另一种方法是

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

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

答案 4 :(得分:3)

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

首先我有一个模板:

<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");
}

答案 5 :(得分:2)

尝试Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged Using conn As New SqlConnection, comm As New SqlCommand 'etc... Try conn.Open() comm.CommandText = "SELECT * FROM..." 'Set dgv1 DataSource... Catch ex As Exception DisplayExceptionMessageBox(ex) End Try End Using End Sub Private Sub dgv1_SelectionChanged(sender As Object, e As EventArgs) Handles dgv1.SelectionChanged dgv2.DataSource = Nothing If dgv1.CurrentRow Is Nothing Then Exit Sub Else 'SELECT * FROM... WHERE id = dgv1.CurrentRow.Cells(0).Value 'Bind to dgv2 End If End Sub

由于Immutable.js主要处理jQuery,因此可能不适合作业。 DOM Elements是由Immutable.js创建的56 kb (minified)库。

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() 有效地克隆newObj。基本上,如果您还没有oldObj,那么我们需要先创建Map。地图就像Map我们合作创建blue-print

参考文献:

主页 - Immutable

文档 - Immutable Docs

GitHub - Immutable@GitHub

祝你好运。

答案 6 :(得分:0)

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

vi..