Clojure是否具有合并(如果存在)功能?

时间:2019-03-11 12:16:57

标签: clojure

clojure是否具有merge-if-exists函数来合并两个地图, 像

(defn merge-if-exists [map1 map2])

返回包含map1的所有键的新映射,并且如果一个键出现在多个映射中,请使用map2的键值作为返回映射值,否则使用{{1} }的价值。

例如

map1

如何编写此功能?

1 个答案:

答案 0 :(得分:8)

您可以使用mergeselect-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))