Если вы хотите переименовать все ключи :desc
независимо от того, на каком уровне вложенности они находятся, это может сработать. Если вы хотите переименовать ключи :desc
только на определенном уровне вложенности, вам понадобится что-то более сложное.
Это работает только потому, что clojure.set/rename-keys
в настоящее время ничего не делает (возвращает свой первый аргумент без изменений), если его первый аргумент не является картой.
user> (require '[clojure [set :as set] [walk :as walk]])
nil
user> (def x {:data1
{:categories
[{:desc "whatever", :name "abc", :id 234}
{:desc "nothing", :name "def", :id 456}]},
:data2
{:categories
[{:desc "whatever", :name "abc", :id 234}
{:desc "nothing", :name "def", :id 456}]}})
#'user/x
user> (walk/postwalk #(set/rename-keys % {:desc :description :id :ID}) x)
{:data1
{:categories
[{:name "abc", :ID 234, :description "whatever"}
{:name "def", :ID 456, :description "nothing"}]},
:data2
{:categories
[{:name "abc", :ID 234, :description "whatever"}
{:name "def", :ID 456, :description "nothing"}]}}
nil