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

标签 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}};

根据 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}});

巨大的“doh”。感谢任何阅读本文的人。我将奖励尽可能多的分数,然后删除此问题。

最佳答案

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

Tour 第一次调用 entend 修改后的“hash1”,最终与“hash2”相同。

在第二次调用中,您合并了两个相同的哈希值。

要实现您的目标,请在扩展参数中传递一个新实例。

result = $.extend(true, {}, hash1, hash2);

这个调用不会修改'hash1'

关于javascript - 为什么这个递归的 jQuery.extend 调用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33919402/

相关文章:

javascript - DIV不隐藏时如何切换图像

javascript - 在页面上的 div 中显示来自图像文件的随机图像

javascript - 根据选项菜单 1 或 2 中的选择隐藏或显示选项菜单

javascript - Express JS - 无法将数组推送到 MongoDB 中的表

javascript - 数据对象数组装饰器模式的替代方案

javascript - 将鼠标悬停在(并离开)一个元素(或其子元素)上时运行一个 Action

jquery - 删除具有特定 id 的表行

javascript - 在段落末尾插入换行符

javascript - 如何延迟 jquery validate 插件的 key up 事件验证?

javascript - 将具有多个函数的 JavaScript 简化为单个函数数组