2012-04-12 18 views
6

Ben "i" bölümü mevcut olup olmadığını kontrol etmek istiyorum karmaşık iç içe bir yapı gibi iç içe geçmiş alanlar üzerinde bir koşulu kabul ettirmek için en iyi yolu ...Filtre karmaşık iç içe yapısıyla haritası

{ 
    :aa {:a "a_val",:b "b_val"}, 
    :qq {:abc 
      { 
       :x1 {:x "abc",:u "ee"}, 
       :x2 {:y "abc",:i "ee"}, 
       :x3 {:x "abc",:i "ee"} 
     } 
     }, 
    :ww {:xyz { 
       :y1 {:x "abc",:u "ee"}, 
       :y2 {:y "abc",:i "0"}, 
       :y3 {:x "abc",:i "ee"} 
       } 
     } 
} 

ne olurdu aa, qq ve ww'nin her birinde "0" değerine sahiptir ve buna bağlı olarak aa, qq ve ww üzerinde hariç tutulur (veya herhangi bir işlem gerçekleştirir). Örneğin "ww" "i" = "0" o pozisyonda daha sonra aşağıda

{ 
    :ww {:xyz { 
      :y1 {:x "abc",:u "ee"}, 
      :y2 {:y "abc",:i "0"}, 
      :y3 {:x "abc",:i "ee"} 
      } 
     } 
} 

cevap

3
user> (defn vvals [m] (when (map? m) (vals m))) 
'user/vvals 
user> (filter #(some #{"0"} (for [v (vvals (val %)), v (vvals v)] (:i v))) xx) 
([:ww {:xyz {:y3 {:x "abc", :i "ee"}, :y2 {:y "abc", :i "0"}, :y1 {:x "abc", :u "ee"}}}]) 
gibi bir harita varsa