如何使用Specter从嵌套Map中提取转换后的目标子Map?
使用Specter从嵌套Map提取目标子Map的简洁方法
当然有!针对你给出的嵌套Map,我们可以用Specter的组合路径快速提取出键为整数、值对应:check字段的Map。
首先先明确原数据:
(def 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}}})
最简洁的实现方式
利用Specter的transformed和MAP-VALS,可以一步完成转换:
(require '[com.rpl.specter :as s]) (s/select-one [:results (s/transformed s/MAP-VALS :check)] cr) ;; 输出结果:{1 true, 2 false}
代码解释
:results:路径定位到嵌套Map中的:results子Map(s/transformed s/MAP-VALS :check):对:results的每个值(也就是每个带:check的子Map)执行转换——MAP-VALS会遍历所有值,:check则作为提取器,取出每个子Map中的:check字段值。最终保留原键,生成新的Map。
另一种等价写法(更直观)
如果你想更清晰地看到键值对的处理过程,也可以用ALL遍历:results的键值对,收集键和对应的:check值,再转成Map:
(into {} (s/select [:results s/ALL (s/collect-one s/FIRST) (s/LAST :check)] cr))
这里ALL遍历每个键值对,collect-one FIRST收集键,LAST :check提取对应值的:check字段,最后用into {}把结果列表转成Map。
两种方法都能得到你想要的目标子Map,第一种更简洁地道,推荐使用。
内容的提问来源于stack exchange,提问作者drRobertz
相关产品推荐
相关产品推荐

