我有这个 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/