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

Yee*_*ezh 3 clojure

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)

如何编写此功能?

Tay*_*ood 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}
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)