假设我有一个如下所示的Clojure映射:
(def mymap {:a [1 2 3] :b {:c [] :d [1 2 3]}})我想要一个remove-empties函数,它可以生成一个新的map,在这个map中,(:b mymap)中具有空序列作为值的条目将被删除。所以(remove-empties mymap)会给出值:
{:a [1 2 3] :b {:d [1 2 3]}}有没有办法用Specter写一个函数来做这件事?
发布于 2017-06-26 15:23:20
(update my-map :b (fn [b]
(apply dissoc b
(map key (filter (comp empty? val) b)))))发布于 2018-01-05 08:31:02
下面是如何使用Specter实现这一点
(use 'com.rpl.specter)
(setval [:b MAP-VALS empty?] NONE my-map)
=> {:a [1 2 3], :b {:d [1 2 3]}}在英语中,意思是“在:b下,找到所有为empty?的映射值。将它们设置为NONE,即删除它们。”
发布于 2017-06-29 14:29:04
这是specter的解决方案:
(ns myns.core
(:require
[com.rpl.specter :as spc]))
(def my-map
{:a [1 2 3]
:b {:c []
:d [1 2 3]}})
(defn my-function
[path data]
(let [pred #(and (vector? %) (empty? %))]
(spc/setval [path spc/MAP-VALS pred] spc/NONE data)))
;; (my-function [:b] my-map) => {:a [1 2 3]
;; :b {:d [1 2 3]}}https://stackoverflow.com/questions/44750837
复制相似问题