如何在映射向量(也包含映射向量)上映射函数以从关键字命名空间中删除所有点?

所以,给定:

[{: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/

10-12 06:43