我有这个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/,这样你就可以玩了。
谁能解释我哪里出错了?谢谢,Max
编辑:我是个白痴。将true作为第一个参数传递正确进行深度合并,但我没有注意到的是我已经覆盖 hash1在我的示例的第一部分(我做非深度)合并),所以当我来做“深度”合并时,我实际上是这样做的:
deep_merged = $.extend(true, {"/":{"what-is-scheme":true}}, {"/":{"what-is-scheme":true}});
大规模的“doh”。感谢任何阅读此内容的人。我将尽可能多地奖励,然后删除这个问题。
答案 0 :(得分:5)
Extend不会复制您的数据结构,它会修改作为第一个参数传递的数据 - 由方法返回。
首次通话以参加已修改的' hash1',最终与' hash2'相同。
在第二个电话中,您正在合并两个相同的哈希值。
要实现您的目标,请在extend参数中传递一个新实例。
result = $.extend(true, {}, hash1, hash2);
此通话不会修改' hash1'