Skip to content

Instantly share code, notes, and snippets.

@rotaliator
Last active September 14, 2021 20:05
Show Gist options
  • Save rotaliator/974d4187760069f4ec9d48d708a6765f to your computer and use it in GitHub Desktop.
Save rotaliator/974d4187760069f4ec9d48d708a6765f to your computer and use it in GitHub Desktop.
(require [meander.epsilon :as m])
(def test-data
{:root
{:first-child
[{:inner-child
[{:element "1"}
{:element "2"}]}
{:elements [{:element "3"}
{:element "4"}
{:nested-elements [{:element "5"}
{:element "6"}]}]}]}})
(defn extract-key
"Returns a sequence of values for given key k from nested map m"
[k m]
(->> (m/search m
(m/$ {~k ?e})
?e)
(filter identity)))
;; or same using postwalk and transients
(defn extract-key2
"Returns a sequence of values for given key k from nested map m"
[k m]
(let [elements (transient [])]
(walk/postwalk
(fn [n]
(when (and (vector? n) (= (first n) k))
(conj! elements (second n)))
n) m)
(persistent! elements)))
(comment
(->> (m/search test-data
(m/$ {:element ?e})
?e)
(filter identity))
;; => ("1" "2" "3" "4" "5" "6")
(extract-key :element test-data)
;; => ("1" "2" "3" "4" "5" "6")
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment