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}}
Другие вопросы по тегам