I've got a sequence of Clojure maps that looks something like this:
({:date "2000-01-01" :value 123}
{:date "2000-01-02" :value 487}
...
{:date "2014-05-01" :value 17})
I want to build a function that will return a similarly-structured sequence of maps, but containing only those maps with :date values between e.g. "2005-11-14" and "2007-08-03".
In their current YYYY-MM-DD form, the dates are compare-able so (compare "2000-01-02" "2001-03-04")
works as expected. However, I can't work out how to extract the :date values from the sequence and compare them.
I've made it as far as (filter #(> 0 (compare (:date %)) "2099-12-09") data)
but can't get any further. Help!
in Clojure, data structure such as vectors, sets, and maps can be used as a function.
That means that if x
is a map, you can get the value by something like (x :date)
.
Therefore the following code will do the job.
(def data '({:date "2005-11-13", :value 0}
{:date "2005-11-15", :value 1}
{:date "2007-08-02", :value 2}
{:date "2007-08-04", :value 3}))
(print (filter
#(and
(> (compare (% :date) "2005-11-14") 0)
(< (compare (% :date) "2007-08-03") 0))
data))
the output will be
({:date 2005-11-15, :value 1} {:date 2007-08-02, :value 2})
EDITED: the following code is slightly better because it gets date from map once per each iteration.
(print (filter
#(let [x (% :date)]
(and
(> (compare x "2005-11-14") 0)
(< (compare x "2007-08-03") 0)))
data))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With