如何在Clojure中向地图添加字段?

时间:2011-04-04 11:49:55

标签: clojure

我有这样的地图:

{:a 1 :b 20}

:我想确保地图上没有遗漏某些字段:

(:a :b :c :d )

:是否有合并两者的功能,如:

(merge-missing-keys {:a 1 :b 20} (:a :b :c :d ))

:可以产生:

{:a 1 :b 20 :c nil :d nil}

更新

根据答案中的一些指示,我发现可以这样做:

(defn merge-missing-keys [
                           a-set 
                           some-keys
                         ]
          (merge-with 
                         #(or %1 %2) 
                         a-set  
                         (into {} (map (fn[x] {x nil}) some-keys))))

(merge-missing-keys {:a 1 :b 20} '(:a :b :c :d :e ))

3 个答案:

答案 0 :(得分:6)

您应该使用merge-with

  

返回一个地图,该地图由其他地图组成   首先。如果一个键出现在多个映射中,则映射(s)   从后者(从左到右)将与映射相结合   通过调用(结果为val-in-later)来得到结果。

因此,以下内容将合并所有地图与从地图或nil中选择的一个实际值。

(merge-with #(or %1 %2) 
            {:a 1 :b 2} 
            {:a nil :b nil :c nil :d nil})
; -> {:d nil :c nil :b 2 :a 1}

这可能足以让您构建实现。

答案 1 :(得分:4)

您始终可以按如下方式合并到默认数组中:

(merge
  {:a nil :b nil :c nil :d nil} ; defaults
  {:a 1 :b 20})                 ; current values

=> {:a 1, :b 20, :c nil, :d nil}

答案 2 :(得分:3)

对@mikera的答案进行了一次试验,以便在你没有以字面值提供密钥时使其工作:

(let [keys [:a :b :c :d]]
 (merge (zipmap keys (repeat nil))
        {:a 1 :b 20}))