我试图使用jQuery深入复制一个对象,但它无法提供一个完全独立的对象。
这是我的密码。
var copy = $.extend(true, {}, this);然后,当我比较这两个对象时,我得到了以下结果:
copy == this => false (目前为止还不错)copy.LstOptions == this.LstOptions => false (目前为止还不错)copy.LstOptions[0] == this.LstOptions[0] => true (problem)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/setter)。
这是一个JSFiddle https://jsfiddle.net/wk9e2kgn/1/,console.log输出true,我希望它能输出false。
发布于 2015-02-12 12:56:50
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;
}发布于 2015-02-12 09:32:31
在您的示例中,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);你可以在这里找到小提琴
https://stackoverflow.com/questions/28472727
复制相似问题