在clojure中的稀疏嵌套映射中设置默认值

时间:2014-09-18 14:21:51

标签: clojure

我有一组地图的默认值,我希望能够获取任何没有值的存储地图并应用默认值。

即。如果我有以下输入

(def defaults {:config {:tablet {:urls [] :enable false}}})
(def stored   {:config {:tablet {         :enable true }}})

我希望能够创建以下结果。

              {:config {:tablet {:urls [] :enable true}}}

因此存储的值在存在时使用,但是当该键不存在时使用默认值。我已经尝试了mergemerge-with mergemerge-with concatmerge-with conj以及其他一些咒语,但似乎都没有。 工作的是,如果你知道嵌套的最大深度,(merge-with (partial merge-with ... (partial merge-with merge) ... )),但这非常hacky。似乎应该有一个更简单的解决方案,因为这似乎在Clojuresque代码中并不常见。

1 个答案:

答案 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}}}