更改集合中的所有关键字,从命名空间中删除点并用短划线替换

Zur*_*iar 1 clojure

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

所以,给定:

[{:my.dotted/namespace "FOO"}
 {:my.nested/vec [{:another.dotted/namespace "BAR"
                   :and.another/one "FIZ"}]}]
Run Code Online (Sandbox Code Playgroud)

变为:

[{:my-dotted/namespace "FOO"}
 {:my-nested/vec [{:another-dotted/namespace "BAR"
                   :and-another/one "FIZ"}]}]
Run Code Online (Sandbox Code Playgroud)

小智 6

听起来像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)))
Run Code Online (Sandbox Code Playgroud)