2015-02-12 24 views
0

我想使用jQuery深拷贝对象,但它无法提供完全独立的对象。jQuery的(深)延伸bug?

这是我的代码。

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

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

  • copy == this =>(到目前为止好)
  • copy.LstOptions == this.LstOptions =>(所以太好了)
  • copy.LstOptions[0] == this.LstOptions[0] =>true问题

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

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

它如何得到深度复制以及如何深度复制?

PS:这里是我的全部boject:

{"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/setter方法)。

这里是一个JSFiddle https://jsfiddle.net/wk9e2kgn/1/其中console.log输出true我期望它输出false

+2

这是对象,而不是数组。只需使用json即可。这本身就是滥用,扩展意味着扩展原型。 – simonzack 2015-02-12 08:37:19

+0

jQuery的文档说:“在一个深入的扩展,对象和数组扩展,但对原始的对象包装...” – 2015-02-12 08:38:39

+0

不能重现:http://jsfiddle.net/o5hbd6f3/你确定'LstOptions'包含你觉得它做什么? (如果数组为空,则将undefined与undefined进行比较,这是真的。) – JJJ 2015-02-12 08:43:15

回答

-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

+1

说“你的代码工作得很好”并不能帮助OP解决他们的问题。 – JJJ 2015-02-12 09:36:09

+0

OP说copy.LstOptions [0] == this.LstOptions [0]这个语句返回true,但是不是那样的,它返回false。我也解释了我的答案。 – 2015-02-12 09:39:14

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