Al ver la solución de amalloy implica reduce
sugirió este para mí:
(def maps [{:a 1 :b 2}
{:a 11 :b 22 :c 5}
{:c 6 :a 7}])
(defn my-merge-maps
[maps]
(reduce (fn [accum [k v]]
(if (accum k)
(assoc accum k (conj (accum k) v))
(assoc accum k #{v})))
{}
(apply concat maps)))
(defn -main
[]
(println (my-merge-maps maps)))
El resultado es: {:C#{5 6}, :b #{2 22}, :a #{1 7 11}}
(gfredericks gracias por señalar que estaba usando accidentalmente varargs. :))
Editar: Y aquí hay otra manera, utilizando merge-with
:
(def maps [{:a 1 :b 2}
{:a 11 :b 22 :c 5}
{:c 6 :a 7}])
(defn build-up-set
[curr-val new-val]
(if (set? curr-val)
(conj curr-val new-val)
#{curr-val new-val}))
(defn my-merge-maps
[maps]
(apply merge-with build-up-set maps))
(defn -main
[]
(println (my-merge-maps maps)))
Esto funciona, pero solo si conoce con anticipación todas las claves que va a coincidir. Una limitación a tener en cuenta. – amalloy