2015-02-12 30 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; 
}