如何在映射向量(也包含映射向量)上映射函数以从关键字命名空间中删除所有点?
所以,给定:
[{:my.dotted/namespace "FOO"}
{:my.nested/vec [{:another.dotted/namespace "BAR"
:and.another/one "FIZ"}]}]
变成:
[{:my-dotted/namespace "FOO"}
{:my-nested/vec [{:another-dotted/namespace "BAR"
:and-another/one "FIZ"}]}]
最佳答案
听起来像是 clojure.walk 的工作!
您可以遍历整个数据结构并将转换函数(在我的版本中为 transform-map
)应用于所有子表单,当它遇到一个映射的键时(这里使用 dotted->dashed
)。
(require '[clojure
[walk :as walk]
[string :as str]])
(defn remove-dots-from-keys
[data]
(let [dotted->dashed #(-> % str (str/replace "." "-") (subs 1) keyword)
transform-map (fn [form]
(if (map? form)
(reduce-kv (fn [acc k v] (assoc acc (dotted->dashed k) v)) {} form)
form))]
(walk/postwalk transform-map data)))
关于clojure - 更改集合中的所有关键字,从命名空间中删除点并替换为破折号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36723449/