如何合并地图并获取列表地图?

Ogu*_*gic 1 functional-programming clojure

让我们说一下地图列表.地图都有相同的关键字,但我们事先并不知道关键字.

[{:a 1 :b 2} {:a 3 :b 4}]
Run Code Online (Sandbox Code Playgroud)

将此列表合并到这样的地图中的惯用方法是什么:

{:a [1 3]
 :b [2 4]}
Run Code Online (Sandbox Code Playgroud)

看起来并不难,但是当我开始实现这个功能时,它变得非常丑陋和重复.我有一种感觉,有更清洁的方法来实现这一目标.

谢谢

Sam*_*tep 5

通过使用标准库中的几个函数,您实际上可以获得非常优雅的解决方案:

(defn consolidate [& ms]
  (apply merge-with conj (zipmap (mapcat keys ms) (repeat [])) ms))
Run Code Online (Sandbox Code Playgroud)

例:

(consolidate {:a 1 :b 2} {:a 3 :b 4})
;=> {:a [1 3], :b [2 4]}
Run Code Online (Sandbox Code Playgroud)

关于这个解决方案的一个很酷的事情是,即使地图有不同的密钥集,它仍然有效.