[英]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}}}
因此,存储的值存在时将使用它们,但当该键不存在时将使用默认值。 我试过merge
, merge-with merge
, merge-with concat
, merge-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.