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

时间:2012-02-14 08:49:28

标签: jquery

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


    });
编辑:我提到了

(Deep) copying an array using jQuery

3 个答案:

答案 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字符串或数组。

如果您的某个属性是另一个对象,则深层复制是相关的。通过深度扩展,子对象的所有属性都会合并,而不仅仅是子对象本身。

我认为你必须使用自己的扩展功能。