嵌套结构简化

嵌套结构简化

问题描述:

在这个结构中我想从输出中删除那个特定的列:我“”比可能吗?嵌套结构简化

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://*.com/questions/10127023/filter-a-map-with-complex-nested-structure – 2012-04-13 08:05:07

由于(相当可怕的)架构不能用通用的方式进行操作。您的模式现在允许查询嵌入式文档中的字段,因为您需要知道更高级别文档的字段名称。换句话说,你不能有一个查询“unset all'x'where'i'empty'”,因为你的模式不适合它。

您将不得不重新设计您的模式以允许您需要执行的操作。作为一个规则,首先写下你需要处理的数据,然后设计一个允许最有效的最常见用例的模式。

从你之前的问题构建......这既能实现原始过滤,又能消除深度子​​元素。

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