You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:26:11