Skip to content

Instantly share code, notes, and snippets.

@mkwatson
Created February 13, 2015 20:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkwatson/eabde4a10942e065bae7 to your computer and use it in GitHub Desktop.
Save mkwatson/eabde4a10942e065bae7 to your computer and use it in GitHub Desktop.
(defn flatten-keys* [a ks m]
(cond
(map? m) (reduce into (map (fn [[k v]] (flatten-keys* a (if-not (empty? ks)
(str ks "." (name k))
(name k)) v)) (seq m)))
(and (sequential? m)
(not (instance? clojure.lang.MapEntry m))) (reduce into (map-indexed (fn [idx itm] (flatten-keys* a (str ks "[" idx "]") itm)) (seq m)))
:else (assoc a ks m)))
(defn flatten-keys [m] (flatten-keys* {} "" m))
(flatten-keys {:one 1 :two [1 2 {:three 5 :seven {:four "whatever" :six ["hello" "world"]}}]})
;; => {"$.one" 1, "$.two[0]" 1, "$.two[1]" 2, "$.two[2].three" 5, "$.two[2].seven.four" "whatever", "$.two[2].seven.six[0]" "hello", "$.two[2].seven.six[1]" "world"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment