2010-06-16 25 views
7

tengo un vector de mapas de esta manera:la conversión de un vector de mapas al mapa de mapas en Clojure

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

y me gustaría generar un mapa de los mapas como este para buscar por nombre de la categoría

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

¿Cómo puedo hacer esto?

Respuesta

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

Mejor aún,

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

segunda forma es realmente fresco. Gracias @Michal. – 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) 

le da un mapa de vectores de mapas

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

(que ahora me doy cuenta que no es lo que quería ... lo siento)

11

Otra forma: (into {} (map (juxt :categoryname identity) [...]))

+0

buen uso de juxt :) –

0

Yo no lo he probado en Clojure, pero en esta variante ClojureScript parece ser más rápido que otros:

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