繁体   English   中英

在Clojure中的稀疏嵌套地图中设置默认值

[英]Set default values in sparse nested map in 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) ... ))但是这是相当哈克。 似乎应该有一个更简单的解决方案,因为这似乎在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}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM