clojure是否具有merge-if-exists
函数来合并两个地图,
像
(defn merge-if-exists [map1 map2])
返回包含map1
的所有键的新映射,并且如果一个键出现在多个映射中,请使用map2
的键值作为返回映射值,否则使用{{1} }的价值。
例如
map1
如何编写此功能?
答案 0 :(得分:8)
您可以使用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}
或者使用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))