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

达克斯·福尔(Dax Fohl)

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

即如果我有以下输入

(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}}}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章