We discuss maps and their useful features, including a key distinction that we couldn't live without.

Each week, we discuss a different topic about Clojure and functional programming.


If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to [email protected], or join the #clojuredesign-podcast channel on the Clojurians Slack.


This week, our topic is: "Maps! Maps! Maps!" We discuss maps and their useful features, including a key distinction that we couldn't live without.


Selected quotes:

"Working with Clojure makes you feel like you're living in the future!"
"Maps are bags of dimensions."

"The namespace of the key is the entity, the name is the attribute, and the value is the value."

"Flatter maps make it so you end up writing less code."

Related episodes:

Time Log series:

015: Finding the Time
016: When 8 - 1 = 6
017: Data, at Your Service
018: Did I Work Late on Tuesday?
019: Dazed by Weak Weeks
020: Data Dessert

049: Keywords! Keywords! Keywords!

Links:

Love Letter To Clojure (Part 1) - Gene Kim

Code sample:


;; Player records: one nested, one with rich keys.

(def players-nested
[{:player {:id 123
:name "Russell"
:position :point-guard}
:team {:id 432
:name "Durham Denizens"
:division :eastern}}
{:player {:id 124
:name "Frank"
:position :midfield}
:team {:id 432
:name "Durham Denizens"
:division :eastern}}])

(def players-rich
[{:player/id 123
:player/name "Russell"
:player/position :point-guard
:team/id 432
:team/name "Durham Denizens"
:team/division :eastern}
{:player/id 124
:player/name "Frank"
:player/position :midfield
:team/id 432
:team/name "Durham Denizens"
:team/division :eastern}])

;; Extract player and team id, along with team name

; Nested
(defn extract
[player]
(let [{:keys [player team]} player]
{:player (select-keys player [:id])
:team (select-keys team [:id :name])}))

#_(map extract players-nested)
; ({:player {:id 123}, :team {:id 432, :name "Durham Denizens"}}
; {:player {:id 124}, :team {:id 432, :name "Durham Denizens"}})

; Rich
#_(map #(select-keys % [:player/id :team/id :team/name]) players-rich)
; ({:player/id 123, :team/id 432, :team/name "Durham Denizens"}
; {:player/id 124, :team/id 432, :team/name "Durham Denizens"})

;; Sort by team name and then player name

; Nested
#_(sort-by (juxt #(-> % :team :name) #(-> % :player :name)) players-nested)
; ({:player {:id 124, :name "Frank", :position :midfield},
; :team {:id 432, :name "Durham Denizens", :division :eastern}}
; {:player {:id 123, :name "Russell", :position :point-guard},
; :team {:id 432, :name "Durham Denizens", :division :eastern}})

; Rich
#_(sort-by (juxt :team/name :player/name) players-rich)
; ({:player/id 124,
; :player/name "Frank",
; :player/position :midfield,
; :team/id 432,
; :team/name "Durham Denizens",
; :team/division :eastern}
; {:player/id 123,
; :player/name "Russell",
; :player/position :point-guard,
; :team/id 432,
; :team/name "Durham Denizens",
; :team/division :eastern})

Twitter Mentions