2012-04-13 179 views
0

在這個結構中我想從輸出中刪除那個特定的列:我「」比可能嗎?嵌套結構簡化

like..input是相同

{

:aa {:a "a_val",:b "b_val"}, 

:qq {:abc 
     { 
      :x1 {:x "abc",:u "ee"}, 
      :x2 {:y "abc",:i "ee"}, 
      :x3 {:x "abc",:i ""} 
    } 
    }, 
:ww {:xyz { 
      :y1 {:x "abc",:u "ee"}, 
      :y2 {:y "abc",:i ""}, 
      :y3 {:x "abc",:i "ee"} 
      } 
    } 

}

,但它像ineed輸出...

{

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

}

+0

http://stackoverflow.com/questions/10127023/filter-a-map-with-complex-nested-structure – 2012-04-13 08:05:07

回答

2

由於(相當可怕的)架構不能用通用的方式進行操作。您的模式現在允許查詢嵌入式文檔中的字段,因爲您需要知道更高級別文檔的字段名稱。換句話說,你不能有一個查詢「unset all'x'where'i'empty'」,因爲你的模式不適合它。

您將不得不重新設計您的模式以允許您需要執行的操作。作爲一個規則,首先寫下你需要處理的數據,然後設計一個允許最有效的最常見用例的模式。

1

從你之前的問題構建......這既能實現原始過濾,又能消除深度子​​元素。

user> (defn vvals [m] (when (map? m) (vals m))) 
'user/vvals 
user> (into {} 
     (for [[k v] xx 
       :when (some #{"0"} (for [v (vvals v), v (vvals v)] (:i v))) 
       :let [v (map (fn [[k v]] [k (into {} (remove #(= (:i (val %)) "0") v))]) v)]] 
      [k (into {} v)])) 

這是有效的,但它變成了一個醜陋的混亂。也許考慮@Remon van Vliet給出的建議。還有可能適合您的任務的zippers API