我有一组地图的默认值,我希望能够获取任何没有值的存储地图并应用默认值。
即。如果我有以下输入
(def defaults {:config {:tablet {:urls [] :enable false}}})
(def stored {:config {:tablet { :enable true }}})
我希望能够创建以下结果。
{:config {:tablet {:urls [] :enable true}}}
因此存储的值在存在时使用,但是当该键不存在时使用默认值。我已经尝试了merge
,merge-with merge
,merge-with concat
,merge-with conj
以及其他一些咒语,但似乎都没有。 工作的是,如果你知道嵌套的最大深度,(merge-with (partial merge-with ... (partial merge-with merge) ... ))
,但这非常hacky。似乎应该有一个更简单的解决方案,因为这似乎在Clojuresque代码中并不常见。
答案 0 :(得分:2)
下面的内容应该允许您任意深入嵌套地图:
(defn deep-merge [& ms]
(apply merge-with
(fn [& vs]
(if (every? map? vs)
(apply deep-merge vs)
(last vs)))
ms))
(deep-merge {:config {:tablet {:urls [] :enable false}}}
{:config {:tablet { :enable true }}})
; => {:config {:tablet {:urls [], :enable true}}}