2015-02-23 41 views

回答

3

的靈感來自@Symfrog:

(defn recursive-filter [m k] 
    (filter #(and (map? %) (contains? % k)) (tree-seq map? vals m))) 
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) 
+0

+1:用好'樹seq'的。 +1:'f'可以是* any *函數,它在地圖上執行測試,而不僅僅是關鍵字。涼! -1:不適用於不可調用的按鍵。 -1:如果一個鍵映射到值「false」或「nil」,則不起作用。 Net = 0 – 2015-02-23 08:10:18

+0

@AlexD如果需要使用不是關鍵字的關鍵字(例如true),可以使用以下內容:'(遞歸篩選數據#(get%true))' – Symfrog 2015-02-23 08:14:15

+0

讓我取回「Net = 0「......這絕對值得+1。 – 2015-02-23 08:20:29