在clojure中的稀疏嵌套映射中设置默认值
我已经为地图设置了一组默认值,我希望能够获取任何没有这些值的存储地图并应用默认值 i、 e.如果我有以下输入在clojure中的稀疏嵌套映射中设置默认值,clojure,Clojure,我已经为地图设置了一组默认值,我希望能够获取任何没有这些值的存储地图并应用默认值 i、 e.如果我有以下输入 (def defaults {:config {:tablet {:urls [] :enable false}}}) (def stored {:config {:tablet { :enable true }}}) 我希望能够创建以下结果 {:config {:tablet {:urls [] :enable true}}} 因此,
(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
,还有其他一些咒语,但似乎都不管用。一个有效的方法是,如果你知道嵌套的最大深度,(与…部分合并)(与…部分合并)
,但这是相当粗糙的。似乎应该有一个更简单的解决方案,因为这在Clojuresque代码中似乎并不少见。以下内容应该允许您合并任意深度嵌套的映射:
(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}}}