簡體   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