[英]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.