如何在地图矢量(也包含地图矢量)上映射函数以从关键字命名空间中删除所有点?
所以,给定:
[{: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)