使用Spectre转换与键匹配的值

时间:2019-01-09 01:29:59

标签: clojure specter

很抱歉,如果其他地方都回答了这个问题,但是我似乎找不到与我所寻找的模式相匹配的示例。我可能还没有完全理解递归幽灵路径。

如果我有数据(明确地带有嵌套向量):

{:a "1" :b "2" :c [ {:a "3" :b "4"} {:a "5" :b "6"} ]}

我想使用keyword键将:a函数应用于所有值,以得出:

{:a :1 :b "2" :c [ {:a :3 :b "4"} {:a :5 :b "6"} ]}

最后,我希望它可以递归到任意深度,并且也可以处理向量大小写。

我已经读过https://github.com/nathanmarz/specter/wiki/Using-Specter-Recursively,但是我必须缺少一些重要的内容。

感谢任何指出我正确方向的人!

2 个答案:

答案 0 :(得分:3)

ProxyPass "/"  "http://localhost:8888"

答案 1 :(得分:2)

不是Spectre解决方案,但可以通过addP2轻松完成:

clojure.walk/postwalk

我什至为(ns demo.core (:require [clojure.walk :as walk] )) (def data {:a "1" :b "2" :c [{:a "3" :b "4"} {:a #{7 8 9} :b "6"}]}) (def desired {:a :1 :b "2" :c [{:a :3 :b "4"} {:a #{7 8 9} :b "6"}]}) (defn transform [form] (if (map-entry? form) (let [[key val] form] (if (and (= :a key) (string? val)) [key (keyword val)] ; can return either a 2-vector {key val})) ; or a map here form)) (walk/postwalk transform data) => {:a :1, :b "2", :c [{:a :3, :b "4"} {:a #{7 9 8}, :b "6"}]} 值之一添加了一个非字符串,使其变得更加棘手。