我尝试使用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
。
答案 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