Clojure преобразовать {"ab" 1, "ac" 2, "de" 3} в {:a {:b 1,:c 2},:d {:e 3}} (для compojure/hiccup с иерархией monger)
Моя схема mongodb имеет иерархию JSON. Когда я получаю параметры поля от compojure, хэш находится в плоской пунктирной записи, как {"a.b" 1, "a.c" 2, "d.e" 3}
, Я хочу использовать monger для вставки данных, но это предполагает настоящий иерархический формат, такой как {:a {:b 1, :c 2}, :d {:e 3}}
, Есть ли способ автоматически конвертировать из одного в другой?
1 ответ
Решение
Ничего автоматического, о котором я знаю, но это довольно просто сделать вручную:
=> (require 'clojure.string)
=> (defn nest-keys [x]
(reduce (fn [m [k v]]
(assoc-in m (map keyword (clojure.string/split k #"\.")) v))
{}
x))
=> (nest-keys {"a.b" 1 "a.c" 2 "d.e" 3})
{:d {:e 3}, :a {:c 2, :b 1}}