jQuery使用$.extend进行深度/递归复制

13

我正在尝试使用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);


    });

编辑:我提到

使用jQuery(深度)复制数组


这四个标签中的一个asp.net.netjquery-uijquery-plugins,与问题有什么关联? - gdoron
3个回答

8

在独立运行时,您的第二个代码片段按预期工作并对obj4执行了深拷贝,将其复制到obj3中。

问题是,之前的代码片段已经将obj4的内容进行了浅层复制,在此过程中完全覆盖了obj3throwable成员。因此,在该代码运行后,throwable.text1obj3中不再存在。

  • Initially, obj3 is :

    { throwable: { text1: 'Ball' }, text3: 'Umpire' }
    
  • After the first code snippet has run, obj3 becomes :

    { throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
    
  • Finally, after the second code snippet has run, obj3 still is:

    { throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
    

1
在你的代码中,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;
}

@Lijo 如果你想看到区别:请看 - Hadas
递归合并不会连接字符串! - sinsedrix
所以现在似乎可以工作了...问题出在哪里? - sinsedrix
alert(result2.throwable.text1 +" - "+ result2.throwable.text4 + " - " + result2.text2 + " - " + result2.text3); 给我返回 "球 - 棒 - 桩 - 裁判" - sinsedrix

1
问题是对象中有两个相同名称的属性:text1。即使使用深度扩展,jQuery扩展也不会将其合并为新的连接字符串或数组。
如果你的某个属性是另一个对象,那么深拷贝就显得非常重要。使用深度扩展,子对象的所有属性都会被合并,而不仅仅是子对象本身。
我认为你需要使用自己的扩展函数。

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