在clojure中,如何在嵌套映射中找到具有某个键的所有映射

vie*_*bel 1 dictionary clojure filter

让我们m成为一个嵌套的地图.如何查找m具有某个键的所有地图.

例如:

(def m {:a {:id 5}
        :d {:id 58}
        :x {:id 4 :c {:id 3 :d 4}}})

(recursive-filter m :id)

;; expected result: 
> ({:id 5} {:id 58} {:id 4 :c {:id 3 :d 4}} {:id 3})
Run Code Online (Sandbox Code Playgroud)

Sym*_*rog 6

您可以使用以下内容:

(def data {:a {:id 5}
           :d {:id 58}
           :x {:id 4 :c {:id 3 :d 4}}})

(defn recursive-filter [m f]
  (filter #(and (map? %) (f %))
          (tree-seq map? vals m)))

(recursive-filter data :id)
Run Code Online (Sandbox Code Playgroud)