2010-06-16 17 views
7

में नक्शे के मैप करने के लिए मैं इस तरह के नक्शे का एक वेक्टर है:नक्शे का एक वेक्टर परिवर्तित 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" }} 

मैं यह कैसे कर सकता हूं?

उत्तर

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

दूसरा रास्ता वास्तव में अच्छा है। धन्यवाद @ मिचल। – Osman

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 का अच्छा उपयोग :) –

0

मैं Clojure में यह परीक्षण नहीं किया है, लेकिन ClojureScript में इस प्रकार दूसरों की तुलना में तेजी से हो गया लगता है:

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