在巨大的clojure地图中过滤不必要的密钥

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)

正如你所看到的,我得到了一个带有键的地图,其中一些键得到了带有地图的列表,这些列表又有一些列表......所以我知道 - >不漂亮.

但是......是否有某种方式来描述我想要的数据,以便我不想要的每个键被过滤掉?

谢谢

lee*_*ski 8

另一种方式,不使用任何外部库,使用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)

前/后行是针对您拥有的确切用例:向下走异异集合,必要时转换值


erd*_*dos 5

如果您只想过滤顶级键,您可以使用选择键

如果你想删除深度嵌套的键,你可以使用spectre。例如,要删除向量中每个项目:h下的所有值:g:d只需写下:

user> (setval [:d ALL :g :h] NONE data)
Run Code Online (Sandbox Code Playgroud)