Select 使用幽灵转换嵌套地图的子地图
Select transformed submaps of nested map using specter
是否有一种直接的方法来 select 子图,其中包含使用 spectre 的嵌套地图中每个地图值的转换子图?
例子: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)
)
我觉得我缺少了一些东西,因为我无法将它表达为一个单独的导航。
能否使用 spectre 在单个 select
或 transform
中表达此查询?
似乎相关,但我不太了解递归路径的工作原理或如何使用它们进行转换。
缺少的部分是 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}
是否有一种直接的方法来 select 子图,其中包含使用 spectre 的嵌套地图中每个地图值的转换子图?
例子: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)
)
我觉得我缺少了一些东西,因为我无法将它表达为一个单独的导航。
能否使用 spectre 在单个 select
或 transform
中表达此查询?
缺少的部分是 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}