jQuery(深度)扩展bug?

时间:2015-02-12 08:34:13

标签: jquery clone

我尝试使用jQuery深度复制对象,但它无法提供完全独立的对象。

这是我的代码。

var copy = $.extend(true, {}, this);

然后当我比较两个对象时,我得到以下结果:

  • copy == this => false (到目前为止一直很好)
  • copy.LstOptions == this.LstOptions => false (到目前为止一直很好)
  • copy.LstOptions[0] == this.LstOptions[0] => true 问题

LstOptions不是原始类型,它实际上是一个对象数组。以下是其内容:

[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}]

它是如何进行深层复制以及如何深度复制的?

Ps:这是我的全部工作:

{"changed":false,"data":null,"LstOptions":[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}],"NewRecord":null,"NewID":0,"done":false}

this也有一些方法(构造函数),没有属性(get / setters)。

这是一个JSFiddle https://jsfiddle.net/wk9e2kgn/1/,其中console.log输出{{​​1}},我希望它输出true

2 个答案:

答案 0 :(得分:0)

jQuery没有深层复制对象的类型是自定义对象的成员。

最好的解决方法可能是创建一个复制构造函数。

编辑: 我刚刚在构造函数的末尾添加了this.constructor = Object.prototype.constructor;,这使得jQuery扩展了对象的深度复制。

SpecialDataField.Options.Option = function (ref) {
    /**
    @type {int}
    */
    this.ID = 0;

    /**
    @type {?string}
    */
    this.Name = null;

    if (ref != null) {
        for (var v in this) {
            if (v in ref) {
                this[v] = ref[v];
            }
        }
    }

    this.constructor = Object.prototype.constructor;
}

答案 1 :(得分:-1)

jQuery在你的例子中运行得非常好。我创建了一个jsfiddle来向您展示jquery使用$.extend制作对象的深层副本。我还通过更改值原始对象的属性来测试它,但它不会影响复制对象的相同属性。

我为此编写的代码如下:

var original= {"changed":false,"data":null,"LstOptions":[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}],"NewRecord":null,"NewID":0,"done":false};

// deep copy
var copy = $.extend(true, {}, original);

// compare objects which results false
alert(original.LstOptions[0]==copy.LstOptions[0]);

// change value
original.LstOptions[0].Name="Ankush";

// check same property of both objects
alert(original.LstOptions[0].Name);
alert(copy.LstOptions[0].Name);

您可以在此处找到jsfiddle