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)
看起来并不难,但是当我开始实现这个功能时,它变得非常丑陋和重复.我有一种感觉,有更清洁的方法来实现这一目标.
谢谢
通过使用标准库中的几个函数,您实际上可以获得非常优雅的解决方案:
(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)
关于这个解决方案的一个很酷的事情是,即使地图有不同的密钥集,它仍然有效.