2012-04-13 5 views
0

이 구조에서 출력에서 ​​특정 열을 제거하고 싶습니다. ( : i "") 가능한 것보다 ???중첩 구조 단순화

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 –

답변

2

일반적인 방법으로는 불가능한 (다소 끔찍한) 스키마 때문에. 상위 레벨 문서의 필드 이름을 알아야하므로 스키마에서 포함 된 문서의 필드에 대한 쿼리를 허용합니다. 즉, 스키마가 적합하지 않기 때문에 "x '가 비어있는"x'를 제외한 모든 쿼리를 쿼리 할 수 ​​없습니다.

필요한 작업을 수행 할 수 있도록 스키마를 다시 설계해야합니다. 일반적으로 데이터로 수행해야 할 작업을 기록한 다음 가장 자주 사용하는 데 가장 효율적으로 사용할 수있는 스키마를 설계하십시오.

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도 있습니다.