Моя схема mongodb имеет иерархию JSON. Когда я получаю параметры поля из compojure, хэш находится в плоской пунктирной нотации, например {"a.b" 1, "a.c" 2, "d.e" 3}
. Я хочу использовать monger для вставки данных, но это ожидает реального иерархического формата, такого как {:a {:b 1, :c 2}, :d {:e 3}}
. Есть ли способ автоматически конвертировать из одного в другой?Clojure конвертировать {"ab" 1, "ac" 2, "de" 3} в {: a {: b 1,: c 2},: d {: e 3}} (для compojure/hiccup с более молодой иерархией)
1
A
ответ
3
Ничего автоматический, что я не знаю, но это довольно просто сделать преобразование вручную:
=> (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}}
Действительно здорово! Есть ли вероятность, что вы можете придумать одинаково краткий обратный конверсионный режим? – lobsterism
Логика для реверса немного сложнее, но вот что я придумал: https://gist.github.com/alexhall/5799651 – Alex