我有一系列Clojure地图,看起来像这样:
({:date "2000-01-01" :value 123}
{:date "2000-01-02" :value 487}
...
{:date "2014-05-01" :value 17})
我想构建一个函数,该函数将返回类似结构的地图序列,但只包含那些地图:日期值介于... “2005-11-14”和“2007-08-03”。
在他们当前的YYYY-MM-DD表单中,日期是可比较的,因此(compare "2000-01-02" "2001-03-04")
按预期工作。但是,我无法弄清楚如何从序列中提取:日期值并进行比较。
我已经达到(filter #(> 0 (compare (:date %)) "2099-12-09") data)
,但无法继续下去。救命啊!
答案 0 :(得分:7)
在Clojure中,可以使用矢量,集合和映射等数据结构作为函数。
这意味着如果x
是地图,您可以通过(x :date)
之类的内容获取值。
因此,以下代码将完成这项工作。
(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))
输出将是
({:date 2005-11-15, :value 1} {:date 2007-08-02, :value 2})
EDITED: 以下代码稍好一些,因为它每次迭代都会从map获取一次。
(print (filter
#(let [x (% :date)]
(and
(> (compare x "2005-11-14") 0)
(< (compare x "2007-08-03") 0)))
data))