Javascript jQuery$.extend将第一个对象中的结果完全替换为第二个对象

Javascript jQuery$.extend将第一个对象中的结果完全替换为第二个对象,javascript,jquery,json,Javascript,Jquery,Json,除了纯代码(没有小提琴)之外,我找不到一种方法来演示这一点,但这里发生了什么:我让AJAX访问JSON文件。我将数据保存到变量中。完成后,我将再次访问另一个JSON文件,目的是合并这两个数据集 $.get('1.json', function (foo) { var res1 = foo; $.get('2.json', function (bar) { var res2 = bar; $.extend(res1, res2); });

除了纯代码(没有小提琴)之外,我找不到一种方法来演示这一点,但这里发生了什么:我让AJAX访问JSON文件。我将数据保存到变量中。完成后,我将再次访问另一个JSON文件,目的是合并这两个数据集

$.get('1.json', function (foo) {
    var res1 = foo;
    $.get('2.json', function (bar) {
        var res2 = bar;
        $.extend(res1, res2);
    });    
});
无论我做什么,res1都会输出res2的数据集。我试过使用

var baz = $.extend({}, res1, res2);
没有运气。

默认情况下,将只执行浅拷贝。例如:

var obj1 = { 
    a : {
        banana: true
    }
}

var obj2 = { 
    a : {
        monkey: true
    }
}

var obj3 = $.extend({}, obj1, obj2);
/*
    obj3 = {
        a : {
            monkey: true
        }
    }
*/
为了进行深度复制(并保留香蕉),您可以使用
.extend
的第二个签名并将
true
作为第一个参数传递:

var obj3 = $.extend(true, {}, obj1, obj2);

您是否尝试将第一个参数设置为
true
以表示深度扩展
.extend(true、res1、res2)哦,是的,这很有效。阅读文档第一个示例显示,它可以在不使用deep的情况下合并这两个文档。有点混乱。非深度可能会混淆,因为如果“第一级(浅)”属性像“a:{deep:true}”一样深,“浅复制”目标在偶然检查时可以“查看”深。从res2复制的“浅”目的地res1将显示“res1.a.deeper”,但“deeper”不是副本,只复制了“a”。检查res1“看起来”是res2的深层副本,但实际上只有第一级是副本/合并的;更深层次只是对res2的一个副作用“窥视”。将res2.a.更改得更深,res1.a.更深反映了这一点。不理解这一点可能是一种危险的暗示,反映在“有点混乱”中。为了帮助其他人:Stryner的解决方案是正确的,并且工作良好,但也引入了一个新对象“{}”,其他对象被合并到该对象中,这不是必需的,因此可能会混淆精确的解决方案。修改为$.extends(true,obj1,obj2)的简单原始代码确实有效,obj1被“扩展”——解决方案不需要创建新对象。正如Stryner所指出的,参数“true”(用于深度复制)是这里的关键。新的对象可能来自问题中的推测,这偏离了主题。@CrisMooney感谢您的澄清