将地图矢量转换为Clojure中的地图地图

时间:2010-06-16 09:44:18

标签: clojure

我有一个这样的地图矢量:

[{:categoryid 1, :categoryname "foo" } 
 {:categoryid 2, :categoryname "bar" } 
 {:categoryid 3, :categoryname "baz" }]

并希望生成这样的地图地图,以便按categoryname

进行搜索
{"foo" {:categoryid 1, :categoryname "foo" }, 
 "bar" {:categoryid 2, :categoryname "bar" }, 
 "baz" {:categoryid 3, :categoryname "baz" }}

我该怎么做?

4 个答案:

答案 0 :(得分:14)

另一种方式:(into {} (map (juxt :categoryname identity) [...]))

答案 1 :(得分:10)

(reduce (fn [m {catname :categoryname :as input}]
          (assoc m catname input))
        {}
        [{:categoryid 1, :categoryname "foo" } 
         {:categoryid 2, :categoryname "bar" } 
         {:categoryid 3, :categoryname "baz" }])

更好的是,

(#(zipmap (map :categoryname %) %)
 [{:categoryid 1, :categoryname "foo" } 
  {:categoryid 2, :categoryname "bar" } 
  {:categoryid 3, :categoryname "baz" }])

答案 2 :(得分:1)

(ns code.groupby
  (:use clojure.contrib.seq-utils))


(def vector-of-maps [ {:categoryid 1, :categoryname "foo" }
                      {:categoryid 2, :categoryname "bar" }
                      {:categoryid 3, :categoryname "baz" } ])

(group-by :categoryname vector-of-maps)

为您提供地图矢量图

{"bar" [{:categoryid 2, :categoryname "bar"}],
 "baz" [{:categoryid 3, :categoryname "baz"}],
 "foo" [{:categoryid 1, :categoryname "foo"}]}

(我现在意识到这不是你想要的......抱歉)

答案 3 :(得分:0)

我没有在Clojure中测试它,但在ClojureScript中,这个变体看起来比其他变体更快:

(reduce #(assoc %1 (:categoryname %2) %2) {} [...])