所以,作为数据库调用的结果,我得到了一个地图矢量,让我们说这样:
[{: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函数搞乱几个小时,我无法绕过它并想出一个合理的方法来做到这一点。
谢谢!
答案 0 :(得分:4)
(reduce (fn [aggr {:keys [make model] :as row}]
(update-in aggr
[make model]
(fnil conj [])
(dissoc row :make :model)))
{} data)
匿名函数执行destructuring bind。 update-in
重写绑定结构。基本思想是使用conj
添加行的其他元素。 fnil
用于指定我们想要向量(当找到nil时使用空向量作为conj
的第一个参数)。结果按地图reduce
合并在一起。