2012-04-13 3 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

Из-за (довольно ужасной) схемы, которая не выполнима в общем виде. Теперь ваша схема позволяет запрашивать поля во встроенных документах, потому что вам нужно знать имена полей документов более высокого уровня. Другими словами, у вас не может быть запроса «unset all« x »где« i »пуст», потому что ваша схема не подходит для него.

Вам нужно будет изменить схему, чтобы разрешить то, что вам нужно. Как правило, начинайте с записи того, что вам нужно делать с вашими данными, а затем создайте схему, которая позволяет наиболее часто использовать usecase.

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, который может быть подходящим для ваших задач.

Смежные вопросы