我正在尝试根据日期时间值对地图进行排序。下面的代码使用clj-time -
中的函数(def items {:a {:time (date-time 2013 12)} :b {:time (date-time 2013 11)}})
(sort-by #(-> % items :month) before? items)
IllegalArgumentException没有方法的实现:: before?的 protocol:#'clj-time.core / DateTimeProtocol for class:nil clojure.core / -cache-protocol-fn(core_deftype.clj:527)
但是我得到了上述异常。我做错了什么?
答案 0 :(得分:3)
#(-> % items :month)
的等价物
#(let [res1 (items %)
res2 (:month res1)]
res2)
res1
始终为nil
,因为您向其提供了items
的地图条目,因此res2也是nil
。并且before?
会在nil
个参数上抛出此异常。
试试这个
(def items {:a {:time (date-time 2013 10)}
:c {:time (date-time 2013 12)}
:b {:time (date-time 2013 11)}})
(sort-by (comp :time second) before? items)
=> ([:a {:time #<DateTime 2013-10-01T00:00:00.000Z>}]
[:b {:time #<DateTime 2013-11-01T00:00:00.000Z>}]
[:c {:time #<DateTime 2013-12-01T00:00:00.000Z>}])
答案 1 :(得分:2)
你需要这样做:
(sort-by (fn [[k v]] (-> v :time)) before? items)
如果您需要排序映射,则需要将日期时间映射作为键,并且:a:b作为值导致对键值进行排序映射排序:
(->> (into [] items)
(map (fn [[k v]] [v k]))
(flatten)
(apply sorted-map-by #(before? (%1 :time) (%2 :time))))