reduce :
(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)))
: {:c #{5 6}, :b #{2 22}, :a #{1 7 11}}
(thanks to gfredericks for pointing out that I accidentally used varargs. :))
Edit: And here in a different way using 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)))
source
share