如何在Clojure中从地图数组创建嵌套地图?

时间:2014-08-25 07:11:08

标签: clojure

所以,作为数据库调用的结果,我得到了一个地图矢量,让我们说这样:

[{:make "vw",  :model "vanagon", :color "blue",   :year 1983}
 {:make "vw",  :model "vanagon", :color "red",    :year 1987}
 {:make "vw",  :model "eurovan", :color "blue",   :year 1995}
 {:make "vw",  :model "eurovan", :color "green",  :year 1997}
 {:make "geo", :model "metro",   :color "blue",   :year 1985}
 {:make "geo", :model "metro",   :color "yellow", :year 1994}]

如何使用两个字段将其转换为嵌套地图,例如像这样:

{"vw"  {"vanagon" [{:color "blue", :year 1983}, {:color "red", :year 1987}]
        "eurovan" [{:color "blue", :year 1995}, {:color "green", :year 1997}]}
 "geo" {"metro" [{:color "blue", :year 1985}, {:color "yellow", :year 1994}]}}

我一直在使用group-by和其他coll函数搞乱几个小时,我无法绕过它并想出一个合理的方法来做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:4)

(reduce (fn [aggr {:keys [make model] :as row}]
          (update-in aggr
                     [make model]
                     (fnil conj [])
                     (dissoc row :make :model)))
        {} data)

匿名函数执行destructuring bindupdate-in重写绑定结构。基本思想是使用conj添加行的其他元素。 fnil用于指定我们想要向量(当找到nil时使用空向量作为conj的第一个参数)。结果按地图reduce合并在一起。