gpt4 book ai didi

clojure - 使用 Spectre 进行递归 map 查询

转载 作者:行者123 更新时间:2023-12-02 17:15:33 48 4
gpt4 key购买 nike

幽灵中有没有一种简单的方法来收集满足谓词的所有结构?

(./pull '[com.rpl/specter "1.0.0"])

(use 'com.rpl.specter)

(def data {:items [{:name "Washing machine"
:subparts [{:name "Ballast" :weight 1}
{:name "Hull" :weight 2}]}]})



(reduce + (select [(walker :weight) :weight] data))
;=> 3

(select [(walker :name) :name] data)
;=> ["Washing machine"]

我们如何获取 :name 的所有值,包括 ["Ballast""Hull"] ?

最佳答案

这是一种方法,使用recursive-pathstay-then-continue 来完成真正的工作。 (如果您省略 select 的路径参数中的最后一个 :name,您将获得完整的“项目/零件图”,而不仅仅是 :name 字符串。)

(def data
{:items [{:name "Washing machine"
:subparts [{:name "Ballast" :weight 1}
{:name "Hull" :weight 2}]}]})

(specter/select
[(specter/recursive-path [] p
[(specter/walker :name) (specter/stay-then-continue [:subparts p])])
:name]
data)
;= ["Washing machine" "Ballast" "Hull"]

更新:为了回答下面的评论,这是上面的一个版本,它下降到树的任意分支,而不是仅下降到 :subparts任何给定节点的分支,不包括 :name (这是我们要提取树中值的键,其本身不应被视为分支点):

(specter/select
[(specter/recursive-path [] p
[(specter/walker :name)
(specter/stay-then-continue
[(specter/filterer #(not= :name (key %)))
(specter/walker :name)
p])])
:name]
;; adding the key `:subparts` with the value [{:name "Foo"}]
;; to the "Washing machine" map to exercise the new descent strategy
(assoc-in data [:items 0 :subparts2] [{:name "Foo"}]))

;= ["Washing machine" "Ballast" "Hull" "Foo"]

关于clojure - 使用 Spectre 进行递归 map 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889373/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com