我有这样的地图:
{: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 ))
答案 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}))