Clojure是否具有merge-if-exists合并两个地图的功能,例如
(defn merge-if-exists [map1 map2])
Run Code Online (Sandbox Code Playgroud)
返回一个包含的所有键的新映射map1,如果一个键出现在多个映射中,则使用map2此键的值作为返回映射值,否则使用map1的值。
例如
(merge-if-exists {:a 1 :b 2} {:b 3})
;=> {:a 1, :b 3}
(merge-if-exists {:a 1 :b 2} {:c 3})
;=> {:a 1, :b 2}
(merge-if-exists{:b 3} {:a 1 :b 2})
;=> {:b 2}
Run Code Online (Sandbox Code Playgroud)
如何编写此功能?
您可以使用merge和定义它select-keys:
(defn merge-if-exists [m1 m2]
(merge m1 (select-keys m2 (keys m1))))
(merge-if-exists {:a 1 :b 2} {:b 3})
=> {:a 1, :b 3}
(merge-if-exists {:a 1 :b 2} {:c 3})
=> {:a 1, :b 2}
(merge-if-exists {:b 3} {:a 1 :b 2})
=> {:b 2}
Run Code Online (Sandbox Code Playgroud)
或使用更快/更高效的版本reduce-kv:
(defn merge-if-exists [m1 m2]
(reduce-kv
(fn [m k v]
(assoc m k (if-let [r (find m2 k)]
(val r)
v)))
{}
m1))
Run Code Online (Sandbox Code Playgroud)