在Clojure中,如何通过值中的键对一组地图进行排序?

时间:2014-06-27 22:11:41

标签: clojure

对于短语来说,这是一个尴尬的问题,但是我说有一组这样的地图:

(def person-1 {:name "Joshua" :birthday {:day 5 :month 12 :year 1960}})
(def person-2 {:name "Louise" :birthday {:day 17 :month 4 :year 1987}})
(def person-3 {:name "Jessica" :birthday {:day 28 :month 5 :year 1972}})

(def people #{person-1 person-2 person-3})

例如,我如何按出生月份对people进行排序?

我知道如果我想按姓名排序,我可以(sort-by :name people),但从语法上来说,我不确定上面的例子是如何工作的。

3 个答案:

答案 0 :(得分:2)

尝试:

(sort-by (comp :year :birthday) people)

这取决于这个人的出生年份。


comp获取一系列函数并将它们组合成一个函数,该函数首先获取参数,首先运行右边的函数,然后获取结果,然后向左进行。

有关详细信息,请参阅comp in ClojureDocs

答案 1 :(得分:1)

sort-by将函数作为它的第一个参数,所以你可以这样做:

(sort-by (fn [m] (-> m :birthday :month)) people)

答案 2 :(得分:0)

另一种选择是使用匿名函数:

(sort-by #(:year (:birthday %)) people)

分享并享受。