2011-04-19 11 views
6

Dañando mi cerebro esta tarde tratando de resolver esto. Soy bastante nuevo para Clojure y Lisp en general. Tengo una estructura de datos que es un vector de mapas y quiero obtener todos los valores para una clave particular de todos los mapas en otro vector.Clojure - extrae los valores de un vector de hashmaps

Por ejemplo, digamos que este es el vector de mapas unidos a myvec:

[ { "key1" "value1" "key2" "value2"} {"key1" "value3" "key2" "value4"} ] 

y quiero un vector que se parece a

[ "value1" "value3" ] 

compone de todos los valores de la clave "key1"

La única manera de que pudiera pensar en que hacer es

(for [i (range (count(myvec)))] ((myvec i) "key1")) 

¿Hay alguna manera más fácil? Parece que debe haberlo.

Gracias.

Respuesta

17

(map #(get % "key1") myvec) debería ser todo lo que necesita. Considere usar: palabras clave en lugar de "cadenas" como claves, ya que en general es mejor y más idiomático. Además, se puede entonces escribir esto ya que solo (map :key1 myvec)

+0

Gracias. Exactamente lo que estaba buscando. Estoy sacando las claves y los valores de una consulta. Devuelvo algo así como "Estado: Cerrado" y estoy configurando un hashmap como {"Estado" "Cerrado"}. Es por eso que no estoy usando: palabras clave. ¿O hay alguna forma de usar palabras clave? –

+2

Puede transformar una cadena en una palabra clave con la función 'keyword'. No vale la pena hacerlo si solo busca algo en el mapa una vez, pero por ejemplo '(into {} (para [[kv] mymap] [(palabra clave k) v]))' convertiría todas las teclas del mapa a palabras clave (con la condición de que sean cadenas actualmente). – amalloy

8
(let [v [{"key1" "value1", "key2" "value2"} {"key1" "value3", "key2" "value4"}]] 
    (vec (map #(% "key1") v))) 

Si utiliza palabras clave para sus claves:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"}]] 
    (vec (map :key1 v))) 

Si no desea incluir nil valores cuando los mapas no tienen la clave dada:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"} {:key2 "value5"}]] 
    (vec (keep :key1 v))) 
Cuestiones relacionadas