嵌套结构简化
问题描述:
在这个结构中我想从输出中删除那个特定的列(:我“”)比可能吗?嵌套结构简化
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"}
}
}
}
答
由于(相当可怕的)架构不能用通用的方式进行操作。您的模式现在允许查询嵌入式文档中的字段,因为您需要知道更高级别文档的字段名称。换句话说,你不能有一个查询“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。
http://*.com/questions/10127023/filter-a-map-with-complex-nested-structure – 2012-04-13 08:05:07