给定Clojure中的一系列地图,如何过滤键的值> (有些价值)?

时间:2014-05-26 04:55:41

标签: dictionary filter clojure sequence

我有一系列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),但无法继续下去。救命啊!

1 个答案:

答案 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))