jQuery深度克隆不是递归的

5
我正在使用js/jQuery,试图创建一个真正的克隆-目前我正在使用jQuery来实现。我期望在多层对象中,甚至子对象也应该被深度克隆,但这似乎并不是事实。下面是我的测试代码和输出,这让我相信jQuery的深度克隆并没有实际克隆所有子对象。
有人编写过真正的深度克隆函数吗?或者有没有办法使jQuery按照预期工作?
代码:
function deepClone (obj) {
    return $.extend(true, {}, obj);
};

var orig = {};
orig.companyData = {};
orig.companyData.TEST= 1;

var deep1 = deepClone(orig);
deep1.companyData.TEST= 0;

var deep2 = deepClone(orig);

console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);

控制台输出:

注意: 我期望得到1、0、1

0 
0
0

1
看起来按预期工作了... https://jsfiddle.net/ufm3vyvL/ - Andrea Casaccia
1
你的代码有效:http://jsfiddle.net/8fsce0yq/ - Jack
1
你提供的代码已经按照你的期望工作了。除非你以其他方式(比如“new MyCustomObject(args)”)创建orig或companyData变量,否则jQuery深拷贝应该可以正常工作。 - Chitrang
1
我无法重现(https://fiddle.jshell.net/zeqa5ucj/)。它按预期记录1、0、1。 - Bergi
1
@JamesMadison:请发布您的实际代码和相同的简短示例JSON。 - Bergi
显示剩余3条评论
2个回答

0

你必须传递要合并的两个对象

function deepClone (obj1, obj2) {
    return $.extend(true, obj1, obj2);
};

var orig = {};
orig.companyData = {};
orig.companyData.TEST = 1;

var deep1 = deepClone(deep1, orig);
deep1.companyData.TEST= 0;
var deep2 = deepClone(deep2, orig);

console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);

查看此代码运行


1
我认为他的意思是创建一个空对象。{} - Jacob Morrison
@JakeMorrison 看看我的 deepClone 函数,这就是我正在做的。 - James Madison
@JamesMadison 你可以在这里尝试一下(https://fiddle.jshell.net/x3559vtn/),它对我有效并返回1,0,1。 - Carlos Laspina
@claspina 嗯,看看我在原帖上的最后一条评论。 - James Madison
1
为什么要将 undefined 传递给 deepClone 函数? - Bergi
显示剩余2条评论

0

jQuery的extend函数似乎适用于大多数对象,一些用户建议问题可能出在我创建js对象的方式上-我不确定罪魁祸首是什么,但我的解决方案如下:

function deepClone(obj) {
    return $.parseJSON(JSON.stringify(obj));
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接