Merge maps in Clojure -
i have 2 maps of following structure:
(def {:key1 10, :key2 100}) (def b {:key1 50, :key3 10})   i want output of form:
{:key1 {:val1 10, :val2 50},   :key2 {:val1 100, :val2 nil},   :key3 {:val1 nil, :val2: 10}}   i looked @ merge-with applies function when key exists in both maps. other solution make set of keys both maps , reduce on make structure want, not feel "idiomatic" clojure.
(defn my-merge [labeled-maps]      (->> (for [[label m] labeled-maps                [k v] m]            {k {label v}})          (apply merge-with merge)))   (def merged (my-merge {:val1 a, :val2 b}))  merged ;=> {:key3 {:val2 10}, :key1 {:val2 50, :val1 10}, :key2 {:val1 100}}   you don't need or want explicit nils introduced when key missing. make legitimate nil value source maps indistinguishable nil introduced merge. 
(get-in [:key3 :val1] merged) ;=> nil (either no value :key3 in map labeled :val1 or value nil)  (get-in [:key3 :val1] merged ::not-found) ;=> :user/not-found (this clear here since did not introduce new nils)      
Comments
Post a Comment