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

jQuery Deep/Recursive Copy using $.extend

我正在尝试使用jquery$.extend合并两个对象。

使用以下代码,我试图提醒("球-树桩-裁判")。但电流输出是("未定义-树桩裁判")。它不实现深度(递归)复制。我们如何纠正这个问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 $(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复制数组


第二个是你的代码和执行的工作位置A到obj3obj4深拷贝,当运行在隔离。

问题是,以前的代码是一个有obj4浅拷贝到obj3,完全overriding ITS与obj4throwable成员的过程。因此,不存在了throwable.text1obj3安切洛蒂在这之后的代码运行。

  • 最初,obj3是:

    1
    { throwable: { text1: 'Ball' }, text3: 'Umpire' }
  • 安切洛蒂的第一代码运行后,obj3变成:

    1
    { throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
  • 最后,将第二代码运行后,obj3安静是:

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


问题是,这两个有相同的属性在对象名字:1。扩展jQuery扩展适用于深,不合并成一个新的字符串连接在或阵列。

深拷贝是相关的,如果你的一个属性是另一个对象。与深部延伸,所有的对象属性的get和儿童出现不只是孩子对象本身。

我想你要走你自己的扩展功能。


在你的代码,text1物业是由extendoverwritten。a i f你想法,contacenates代码字符串,extend你自己,不要做。

什么样:

1
2
3
4
5
6
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;
}