我为地图设置了一组默认值,并且我希望能够获取任何没有值的存储地图并应用默认值。
即如果我有以下输入
(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}}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句