Dictionary 给定Clojure中的一系列映射,如何筛选键的值>;(一些价值)?

Dictionary 给定Clojure中的一系列映射,如何筛选键的值>;(一些价值)?,dictionary,filter,clojure,sequence,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格式中,日期是可比较的,因此(比较“2000-01-02”“2001-03

我有一系列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格式中,日期是可比较的,因此
(比较“2000-01-02”“2001-03-04”)
的效果与预期一致。但是,我无法解决如何从序列中提取:date值并进行比较


我已经完成了
(筛选(>0(比较(:日期%))“2099-12-09”)数据)
,但无法获得更多。救命啊

在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))
编辑: 下面的代码稍微好一点,因为它每次迭代都会从map中获取一次日期

 (print (filter
         #(let [x (% :date)]
           (and
              (> (compare x "2005-11-14") 0)
              (< (compare x "2007-08-03") 0)))
         data))
(打印(过滤器
#(让[x(%:日期)]
(及
(>(比较x“2005-11-14”)0)
(<(比较x“2007-08-03”)0)
(数据)

谢谢你,蒙纳德-你知道,我在实验中差点就成功了!您的代码工作完美,非常容易理解;现在我只需要自己学会用这种方式编写代码
 (print (filter
         #(let [x (% :date)]
           (and
              (> (compare x "2005-11-14") 0)
              (< (compare x "2007-08-03") 0)))
         data))