Clojure将{“a.b”1,“a.c”2,“d.e”3}转换为{:a {:b 1,:c 2},:d {:e 3}}(对于具有monger层次结构的compojure / hiccup)

时间:2013-06-17 14:55:23

标签: clojure 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 个答案:

答案 0 :(得分: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}}