惯用地将地图合并到具有clojure的值集的地图中

Tob*_*ede 5 idioms clojure

我正在尝试使用clojure将多个地图合并到一个地图中.

输入

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

预期

{:a #{1,2,3,4}, :b #{"a" "b" "c"}} 
Run Code Online (Sandbox Code Playgroud)

每个键的值将转换为原始映射中的一组值.

mik*_*era 5

我使用merge-with,使用包含空集的预构建结构:

(def data [{:a 1 :b "a"}
           {:a 2 :b "b"}
           {:a 3 :b "c"}
           {:a 4 :b "a"}])

(let [base {:a #{} :b #{}}]
  (apply merge-with conj base data))

=> {:a #{1 2 3 4}, :b #{"a" "b" "c"}}
Run Code Online (Sandbox Code Playgroud)

在基本映射中使用空集的技巧是conj具有要处理的具体对象,因此可以正常工作.