clojure merge-with删除不常见的键

Rob*_*ler 0 clojure map

(def data {"Bob"    {"A" 3.5  "B" 4.5 "C" 2.0}
           "Jane"   {"A" 2.0  "B" 1.5 "D" 4.0}})
Run Code Online (Sandbox Code Playgroud)

调用

(merge-with + (data "Bob") (data "Jane"))
Run Code Online (Sandbox Code Playgroud)

产生

 {"A" 5.5, "B" 6.0, "C" 2.0 "D" 4.0}
Run Code Online (Sandbox Code Playgroud)

我只想创建一个合并的地图,但仅限于公共密钥.我正在寻找的结果是

   {"A" 5.5, "B" 6.0}
Run Code Online (Sandbox Code Playgroud)

在clojure中这样做的好方法是什么?

ama*_*loy 5

这是一个相当简单的单遍方法,它应该胜过迄今为止建议的多遍方法,而不是特别难以阅读:

(defn merge-matching [f a b]
  (into {}
        (for [[k v] a
              :let [e (find b k)]
              :when e]
          [k (f v (val e))])))
Run Code Online (Sandbox Code Playgroud)