Clojure中的自定义相等区别

时间:2015-10-07 17:35:47

标签: clojure

在Clojure程序中,我有一个由包含人名和电子邮件的地图组成的数组。

e.g。

[
    { :name "John" :email "john@gmail.com" }  
    { :name "Batman" :email "batman@gmail.com" }  
    { :name "John Doe" :email "john@gmail.com" }  
 ] 

我想删除重复的条目,为了进行比较,考虑具有相同电子邮件的对等于。在上面的示例中,输出将是:

[
    { :name "John" :email "john@gmail.com" }  
    { :name "Batman" :email "batman@gmail.com" }  
 ] 

在Clojure中实现这一目标的最佳方法是什么?有没有办法让不同的人知道什么等于使用函数?

感谢。

2 个答案:

答案 0 :(得分:7)

这样做:https://crossclj.info/fun/medley.core/distinct-by.html

链接中的功能会懒洋洋地浏览每个值,并存储它所看到的所有内容。如果已经看到coll中的值,则不会添加它。

然后,您可以将其称为:(distinct-by #(% :email) maps),其中maps是人物地图的矢量。

答案 1 :(得分:1)

distinct-by可以很容易地实现为

(defn distinct-by [f coll]
  (let [groups (group-by f coll)]
    (map #(first (groups %)) (distinct (map f coll)))))

对于示例案例,可以像

一样使用
(distinct-by :email
             [{:name "John" :email "john@gmail.com"}  
              {:name "Batman" :email "batman@gmail.com"}  
              {:name "John Doe" :email "john@gmail.com"}])