因此,作为数据库调用的结果,我得到了一个地图矢量,可以这样说:
[{: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}]
Run Code Online (Sandbox Code Playgroud)
如何使用两个字段将其放入嵌套地图中,例如:
{"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}]}}
Run Code Online (Sandbox Code Playgroud)
我已经group-by和其他coll函数搞混了两个小时,我无法解决这个问题,并想出一种合理的方法来做到这一点。
谢谢!
(reduce (fn [aggr {:keys [make model] :as row}]
(update-in aggr
[make model]
(fnil conj [])
(dissoc row :make :model)))
{} data)
Run Code Online (Sandbox Code Playgroud)
匿名函数执行解构绑定。update-in重写绑定结构。基本思想是用于conj添加该行的其他元素。 fnil在那里指定我们想要向量(当找到nil时,使用空向量作为的第一个参数conj)。结果通过组合在地图中reduce。