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

mic*_*hbf 1 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}]
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函数搞混了两个小时,我无法解决这个问题,并想出一种合理的方法来做到这一点。

谢谢!

cgr*_*and 5

(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

  • 编辑我的答案以保留未用于路径的任何条目。 (2认同)