Opérations sur les Maps: partie 2

Il existe un grand nombre de fonctions simplifiant la manipulation complexe de Maps en Clojure.

En voici quelques unes permettant notamment de manipuler des maps imbriquées de façon simple.

En Clojure on se retrouve souvent face à des structures de données qui peuvent s'avérer complexes. Heureusement, la librairie standard est généralement assez riche pour travailler sur ces données sans complications inutiles.

assoc-in

La fonction assoc-in permet d'associer une clé à une valeur (comme assoc) dans une map imbriquée dans une ou plusieurs autres maps.

{:foo {:bar {:hello "hello"}}}

La structure de données précédente est une imbrication de trois maps. Comment mettre à jour facilement la map la plus imbriquée (celle contenant la clé :hello) ?

(assoc-in {:foo {:bar {:hello "hello"}}}
          [:foo :bar :goodbye] "goodbye")

Le code précédent traversera les deux premières map en utilisant les clés :foo et :bar et ensuite associera à la dernière clé du vector passée en paramètre (:goodbye) la valeur goodbye.

get-in

Cette fonction permet de récupérer une valeur présente dans plusieurs maps imbriquées. Par exemple, pour récupérer la valeur de la clé :hello dans la map précédente, on pourra faire:

(get-in {:foo {:bar {:hello "hello"}}}
        [:foo :bar :hello])

update-in

Cette fonction permet de mettre à jour une valeur dans une map imbriquée. Par exemple:

(update-in {:foo {:bar {:hello 1}}}
          [:foo :bar :hello] inc

incrémentera la valeur de la clé hello.

Précédent - Suivant -

;; add value in nested maps
(println (assoc-in
          {:foo {:bar {:hello "hello"}}}
          [:foo :bar :goodbye] "goodbye") "\n")

;; get a value in nested maps
(println (get-in
          {:foo {:bar {:hello 1}}}
          [:foo :bar :hello]) "\n")

;; update value in nested maps
(println (update-in
          {:foo {:bar {:hello 1}}}
          [:foo :bar :hello]
          inc) "\n")

;; select keys in a map
(println (select-keys {:foo 1 :bar 2 :baz 3} [:foo :baz]) "\n")

;; merge two maps
(println (merge {:foo 1 :bar 2} {:foo 2 :baz 3}))

Powered by mcorbin - Available on Github