使用specter选择嵌套地图的变换子图

时间:2018-04-20 11:25:37

标签: clojure specter

是否有直接的方法使用幽灵选择包含嵌套地图中每个地图值的变换子图的子图?

示例:cr是嵌套地图,

{:marks {:these :values :are :omitted}, 
 :scores {:to :simplify :the :example}, 
 :results {1 {:total 8, :sums {:p1 5, :p2a 3}, :check true}, 
           2 {:total 8, :sums {:p1 9, :p2b -1}, :check false}}}

从此我想提取一个包含的地图(int - > boolean) 对于:results中的每个键,与:check键相关联的值

在这种情况下{1 true 2 false}

我可以分两步完成

 (:results (spc/transform [:results spc/MAP-VALS] :check cr))

或者,在所需子图不在顶层的一般情况下

(spc/select-one [...... :results] (spc/transform .... cr))

如果没有幽灵,转化可以表达为与

完全相似(并且可以说明显不少)
(mapmap #(:check %2) (:results cr))

mapmap是

(defn mapmap
"creates a map, by mapping f over the values in m
f is a function with two arguments, and is passed
the key and the value "
[f m]
    (reduce-kv #(assoc %1 %2 (f %2 %3) ) {} m)
)

我觉得我错过了一些东西,因为我无法用幽灵作为单一导航来表达它。 此查询可以使用幽灵在单个selecttransform中表达吗?

Recursive map query using specter似乎有关系,但我不太了解递归路径的工作原理或如何将它们用于转换。

1 个答案:

答案 0 :(得分:0)

缺少的部分是transformed导航器:

(transformed path update-fn)

Navigates to a view of the current value by transforming it with the 
specified path and update-fn.

可用于所需的单线

(spc/select-one [:results (spc/transformed [spc/MAP-VALS] :check)] cr)
==> {1 true, 2 false}