2010-06-16 61 views
7

地圖的地圖我有地圖的載體是這樣的:轉換地圖的載體,用Clojure

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

,並想生成地圖像這樣的地圖,通過類別名稱搜索

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

我該怎麼做?

回答

9
(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" }]) 
+0

第二種方式是真的很酷。 謝謝@Michal。 – Osman 2010-06-16 10:29:08

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"}]} 

(我現在認識的載體是不是你想要的...對不起)

11

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

+0

不錯的使用juxt :) – 2010-06-16 11:38:40

0

我沒有用Clojure測試,但在ClojureScript這個變體似乎比別人快:

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