繁体   English   中英

解散地图的多个后代键?

[英]Dissoc multiple descendent keys of a map?

如何搜索和分解多个后代密钥。

例:

(def d {:foo 123
        :bar {
          :baz 456
          :bam {
            :whiz 789}}})

(dissoc-descendents d [:foo :bam])
;->> {:bar {:baz 456}}

clojure.walk在这种情况下很有用:

(use 'clojure.walk)
(postwalk #(if (map? %) (dissoc % :foo :bam) %) d)

如果你想直接实现它,那么我建议这样的事情:

(defn dissoc-descendents [coll descendents]
  (let [descendents (if (set? descendents) descendents (set descendents))]
    (if (associative? coll)
      (reduce
        (fn [m [k v]] (if (descendents k) 
                        (dissoc m k)
                        (let [new-val (dissoc-descendents v descendents)]
                          (if (identical? new-val v) m (assoc m k new-val)))))
        coll
        coll)
      coll)))

关于实施的关键事项:

  • 将后代转换为集合是有意义的:如果要删除的键集很大,这将允许快速成员资格测试
  • 有一些逻辑可以确保如果值没有改变,您不需要改变地图的那一部分。 如果地图的大部分区域保持不变,这是一个非常大的表现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM