Clojure中的合并映射

Clojure中的合并映射,clojure,Clojure,我有两张以下结构的地图: (def a {:key1 10, :key2 100}) (def b {:key1 50, :key3 10}) 我想要表单的输出: {:key1 {:val1 10, :val2 50}, :key2 {:val1 100, :val2 nil}, :key3 {:val1 nil, :val2: 10}} 我查看了merge with,但这仅在两个映射中都存在一个键时才应用函数。另一个解决方案是从两个映射中生成一组键,然后对其进行缩减以生成我想要的结

我有两张以下结构的地图:

(def a {:key1 10, :key2 100})
(def b {:key1 50, :key3 10})
我想要表单的输出:

{:key1 {:val1 10, :val2 50}, 
 :key2 {:val1 100, :val2 nil}, 
 :key3 {:val1 nil, :val2: 10}}
我查看了
merge with
,但这仅在两个映射中都存在一个键时才应用函数。另一个解决方案是从两个映射中生成一组键,然后对其进行缩减以生成我想要的结构,但这感觉不是很“惯用”的Clojure



您不需要或不希望在缺少密钥时引入显式nils。这将使源映射中的合法
nil
值与合并引入的
nil
无法区分

(get-in [:key3 :val1] merged)
;=> nil (either no value for :key3 in the map labeled :val1 or the value was nil)

(get-in [:key3 :val1] merged ::not-found)
;=> :user/not-found (this is clear here since we did not introduce any new nils)

这几乎是重复的。我在发布之前检查了这个问题,但它与我想要的不同。
(def merged (my-merge {:val1 a, :val2 b}))

merged
;=> {:key3 {:val2 10}, :key1 {:val2 50, :val1 10}, :key2 {:val1 100}}
(get-in [:key3 :val1] merged)
;=> nil (either no value for :key3 in the map labeled :val1 or the value was nil)

(get-in [:key3 :val1] merged ::not-found)
;=> :user/not-found (this is clear here since we did not introduce any new nils)