我正在尝试使用jQuery $ .extend合并两个对象。
使用以下代码,我试图提醒(“Ball - Stump - Umpire”)。但目前的输出是(“Undefined - Stump - Umpire”)。它没有实现深度(递归)副本。我们如何纠正这个?
$(document).ready(function () {
debugger;
//$.extend
var obj3 = { throwable: { text1: 'Ball' }, text3: 'Umpire' };
var obj4 = { throwable: { text4: 'Bat' }, text2: 'Stump' }
//Simple Copy
var result1 = $.extend(obj3, obj4);
//alert(result1.throwable.text4 + " - " + result1.text2 + " - " + result1.text3);
//Deep Copy
//First parameter is passed as Boolean true to accomplish deep (recursive) copy
var result2 = $.extend(true, obj3, obj4);
alert(result2.throwable.text1 + " - " + result2.text2 + " - " + result2.text3);
});
编辑:我提到了
答案 0 :(得分:8)
您的第二个代码段确实可以按预期工作,并在obj4
时执行obj3
的深层复制,在隔离运行时执行 。
问题是,之前的代码段已经将obj4
的浅副本执行到obj3
,完全覆盖其throwable
成员{{1}在这个过程中。因此,代码运行后obj4
内不再存在throwable.text1
。
最初,obj3
是:
obj3
第一个代码段运行后,{ throwable: { text1: 'Ball' }, text3: 'Umpire' }
变为:
obj3
最后,在第二个代码段运行后,{ throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
仍为:
obj3
答案 1 :(得分:0)
在您的代码中,text1
属性会被extend
覆盖。我想要一种方法来控制字符串,编写自己的代码,extend
不要这样做。
类似的东西:
function(o1, o2) {
var ores = {};
for(var p in o1) ores.p = o1.p;
for(var p in o2) ores.p = ores.p ? ores.p+o2.p : o2.p;
return ores;
}
答案 2 :(得分:0)
问题是,对象中有两个具有相同名称的属性:text1。即使使用深度扩展,jquery extend也不会将其合并为新的concat字符串或数组。
如果您的某个属性是另一个对象,则深层复制是相关的。通过深度扩展,子对象的所有属性都会合并,而不仅仅是子对象本身。
我认为你必须使用自己的扩展功能。