I recently needed to take a nested map and flatten the keys. After a bit of trial and error I came up with the following code. (note: the example expects
Expectations)(ns example
(:use expectations))
(defn flatten-keys* [a ks m]
(if (map? m)
(reduce into (map (fn [[k v]] (flatten-keys* a (conj ks k) v)) (seq m)))
(assoc a ks m)))
(defn flatten-keys [m] (flatten-keys* {} [] m))
(expect
{[:z] 1, [:a] 9, [:b :c] Double/NaN, [:b :d] 1, [:b :e] 2, [:b :f :g] 10, [:b :f :i] 22}
(flatten-keys {:z 1 :a 9 :b {:c Double/NaN :d 1 :e 2 :f {:g 10 :i 22}}}))
As the test shows, the code converts{:z 1 :a 9 :b {:c Double/NaN :d 1 :e 2 :f {:g 10 :i 22}}}into{[:z] 1, [:a] 9, [:b :c] Double/NaN, [:b :d] 1, [:b :e] 2, [:b :f :g] 10, [:b :f :i] 22}Improvement suggestions welcome.
© Jay Fields - www.jayfields.com
Published on September 30, 2010 15:54