Tob*_*s S 2 dictionary nested clojure
我在Clojure中得到了一个非常大的屁股嵌套地图,我正在寻找最常用的方法来踢出钥匙,这不应该提供给前端(是的,这个clojure服务在后端运行).
数据结构如下:
(def data
{:a 1
:b 2
:c 3
:d [{:e 5}
{:f 6
:g {
:h 8
:i 9
:j 10}
:l [{
:m 11
:n 12
:p {:q 13
:r 14
:s 15
}}
{:m 16
:n 17
:p {:q 18
:r 19
:s 20
}}]}]})
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我得到了一个带有键的地图,其中一些键得到了带有地图的列表,这些列表又有一些列表......所以我知道 - >不漂亮.
但是......是否有某种方式来描述我想要的数据,以便我不想要的每个键被过滤掉?
谢谢
另一种方式,不使用任何外部库,使用clojure.walk:
(defn remove-deep [key-set data]
(clojure.walk/prewalk (fn [node] (if (map? node)
(apply dissoc node key-set)
node))
data))
user> (remove-deep [:i :l] data)
;;=> {:a 1, :b 2, :c 3, :d [{:e 5} {:f 6, :g {:h 8, :j 10}}]}
user> (remove-deep [:f :p] data)
;;=> {:a 1, :b 2, :c 3, :d [{:e 5} {:g {:h 8, :i 9, :j 10}, :l [{:m 11, :n 12} {:m 16, :n 17}]}]}
Run Code Online (Sandbox Code Playgroud)
前/后行是针对您拥有的确切用例:向下走异异集合,必要时转换值
如果您只想过滤顶级键,您可以使用选择键
如果你想删除深度嵌套的键,你可以使用spectre。例如,要删除向量中每个项目:h下的所有值:g,:d只需写下:
user> (setval [:d ALL :g :h] NONE data)
Run Code Online (Sandbox Code Playgroud)