为什么这个递归的jQuery.extend调用不起作用?

Max*_*ams 1 javascript jquery

我有这个javascript代码,使用jquery.extend:

hash1 = {"/":{"programme-nav":true}};
hash2 = {"/":{"what-is-scheme":true}};
merged = $.extend(hash1, hash2);
deep_merged =  $.extend(true, hash1, hash2);
//expected_deep_merged = {"/":{"programme-nav":true, "what-is-scheme":true}};
console.log("merged = "+JSON.stringify(merged));
// gives {"/":{"what-is-scheme":true}};
console.log("deep_merged = "+JSON.stringify(deep_merged));
// also gives {"/":{"what-is-scheme":true}};
Run Code Online (Sandbox Code Playgroud)

根据API(https://api.jquery.com/jquery.extend/),true作为第一个参数传递将递归合并对象.在这种情况下,我希望在评论中得到结果.但是,我和非深度扩展时的情况相同.

我已经为此设置了一个jsfiddle,输出到控制台,https://jsfiddle.net/0725apqn/2/ ,这样你就可以玩了.

任何人都可以解释我哪里出错了?谢谢,马克斯

编辑:我是个白痴.将true作为第一个参数传递正确进行深度合并,但我没有注意到的是我已经在我的示例的第一部分(我在非深度合并中)覆盖了 hash1,所以当我来做"深度"合并,我实际上是这样做的:

deep_merged =  $.extend(true, {"/":{"what-is-scheme":true}}, {"/":{"what-is-scheme":true}});
Run Code Online (Sandbox Code Playgroud)

大规模的"doh".感谢任何阅读此内容的人.我将尽可能多地奖励,然后删除这个问题.

小智 5

Extend不会复制您的数据结构,它会修改作为第一个参数传递的数据 - 由方法返回.

巡视第一次调用以修改'hash1',最终与'hash2'相同.

在第二个调用中,您将合并两个相同的哈希值.

要实现您的目标,请在extend参数中传递一个新实例.

result = $.extend(true, {}, hash1, hash2);
Run Code Online (Sandbox Code Playgroud)

此调用不会修改'hash1'

  • @MaxWilliams你仍然需要空对象,因为否则`hash1`会被改变.请参阅:https://jsfiddle.net/6kbm2hma/1/暗示这不是这种情况,通过将返回值分配给新变量肯定会导致以后出现问题. (2认同)