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

Zub*_*air 9 clojure

我有这样的地图:

{:a 1 :b 20}
Run Code Online (Sandbox Code Playgroud)

:我想确保地图上没有丢失某些字段:

(:a :b :c :d )
Run Code Online (Sandbox Code Playgroud)

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

(merge-missing-keys {:a 1 :b 20} (:a :b :c :d ))
Run Code Online (Sandbox Code Playgroud)

:哪个可以产生:

{:a 1 :b 20 :c nil :d nil}
Run Code Online (Sandbox Code Playgroud)

更新:

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

(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 ))
Run Code Online (Sandbox Code Playgroud)

pon*_*zao 6

你应该使用merge-with:

返回一个映射,该映射由第一个映射的其余映射组成.如果一个键出现在多个映射中,则后者(从左到右)的映射将通过调用(f val-in-result 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}
Run Code Online (Sandbox Code Playgroud)

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