Quiero transformar un mapa de valores en otro mapa con las mismas teclas pero con una función aplicada a los valores. Creo que había una función para hacer esto en la api clojure, pero no he podido encontrarla.
Aquí hay un ejemplo de implementación de lo que estoy buscando
(defn map-function-on-map-vals [m f]
(reduce (fn [altered-map [k v]] (assoc altered-map k (f v))) {} m))
(println (map-function-on-map-vals {:a "test" :b "testing"} #(.toUpperCase %)))
{:b TESTING, :a TEST}
¿Alguien sabe si map-function-on-map-vals
ya existe? Creo que sí (probablemente con un nombre más agradable también).
dictionary
clojure
map-function
Thomas
fuente
fuente
map
por alguna razón.Puedes usar el
clojure.algo.generic.functor/fmap
:fuente
org.clojure/algo.generic "0.1.0"
el ejemplo ahora debería leer:(use '[clojure.algo.generic.functor :only (fmap)]) (fmap inc {:a 1 :b 3 :c 5})
fmap
en ClojureScript?Aquí hay una forma bastante típica de transformar un mapa.
zipmap
toma una lista de claves y una lista de valores y "hace lo correcto" produciendo un nuevo mapa de Clojure. También puede ponermap
alrededor de las teclas para cambiarlas, o ambas.o para envolverlo en su función:
fuente
Tomado del Clojure Cookbook, hay reduce-kv:
fuente
Aquí hay una forma bastante idiomática de hacer esto:
Ejemplo:
fuente
map-map
`map-map-keys
` ymap-map-values
No sé de ninguna función existente en Clojure para esto, pero aquí hay una implementación de esa función, ya
map-map-values
que puede copiarla libremente. Viene con dos funciones estrechamente relacionadasmap-map
ymap-map-keys
que también faltan en la biblioteca estándar:Uso
Puedes llamar
map-map-values
así:Y las otras dos funciones como esta:
Implementaciones alternativas
Si solo desea
map-map-keys
omap-map-values
, sin lamap-map
función más general , puede usar estas implementaciones, que no dependen demap-map
:Además, aquí hay una implementación alternativa
map-map
que se basa enclojure.walk/walk
lugar deinto
, si prefiere esta redacción:Versiones paralelas
pmap-map
, etc.También hay versiones paralelas de estas funciones si las necesita. Simplemente usan en
pmap
lugar demap
.fuente
Soy un Clojure n00b, por lo que puede haber soluciones mucho más elegantes. Aquí está el mío:
El anon func hace una pequeña lista de 2 de cada tecla y su valor f'ed. Mapcat ejecuta esta función sobre la secuencia de las teclas del mapa y concatena todos los trabajos en una gran lista. "aplicar hash-map" crea un nuevo mapa a partir de esa secuencia. El (% m) puede parecer un poco extraño, es Clojure idiomático para aplicar una clave a un mapa para buscar el valor asociado.
Lectura más recomendada: La hoja de trucos de Clojure .
fuente
fuente
Me gusta tu
reduce
versión Con una variación muy leve, también puede retener el tipo de estructuras de registros:El
{}
fue reemplazado porm
. Con ese cambio, los registros siguen siendo registros:Al comenzar
{}
, el registro pierde su capacidad de grabación , que es posible que desee conservar, si desea las capacidades de registro (representación de memoria compacta, por ejemplo).fuente
Me pregunto por qué nadie ha mencionado la biblioteca de espectros todavía. Se ha escrito para que este tipo de transformación sea fácil de codificar (y, lo que es más importante, el código escrito sea fácil de entender), sin dejar de ser muy eficaz:
Escribir una función de este tipo en Clojure puro es simple, pero el código se vuelve mucho más complicado una vez que pasa a un código altamente anidado compuesto por diferentes estructuras de datos. Y aquí es donde entra el espectro .
Recomiendo ver este episodio en Clojure TV que explica la motivación y los detalles del espectro .
fuente
Clojure 1.7 ( lanzado el 30 de junio de 2015) proporciona una solución elegante para esto con
update
:fuente