Merging maps in Clojure


2012-12-02 · 1 min read

There are several ways to merge maps in Clojure.

(merge {:a 1} {:b 2})

{:a 1, :b 2}
(into {} '({:a 1} {:b 2}))

{:a 1, :b 2}
(reduce conj '({:a 1} {:b 2}))

{:a 1, :b 2}

into is more efficient than reduce because it uses transient collections.

(apply merge '({:a 1} {:b 2}))

{:a 1, :b 2}

If there is a key that is in multiple maps, then the value from the last map will end up in the combined map.

(into {} '({:a 1} {:b 2} {:b 3}))

{:a 1, :b 3}

merge-with allows to specify how to combine values for the same keys using a custom function. Here, we are using + function to simply sum up values for the same key.

(merge-with + {:a 1} {:b 2} {:b 3})

{:b 5, :a 1}

You can use union from clojure.set to merge sets of elements as shown below.

(use 'clojure.set)
(merge-with union
            {:a #{1 2 3}, :b #{4 5 6}}
            {:a #{2 3 11 22}, :c #{1 2 3}})

{:a #{1 22 3 2 11}, :b #{4 6 5}, :c #{1 3 2}}