clojure地图集 - 基本过滤

时间:2012-08-18 18:47:37

标签: clojure

Clojure初学者在这里..

如果我有一组地图,例如

 (def kids #{{:name "Noah" :age 5}
     {:name "George":age 3}
     {:name "Reagan" :age 1.5}})  

我知道我可以得到这样的名字

  (map :name kids)

1)如何选择特定地图?例如   我想找回name =“Reagan”的地图。

 {:name "Reagan" :age 1.5}

可以使用过滤器完成吗?

2)如果年龄= 3,请返回姓名?

2 个答案:

答案 0 :(得分:8)

是的,您可以使用filter

执行此操作
(filter #(= (:name %) "Reagan") kids)

(filter #(= (:age %) 3) kids)

答案 1 :(得分:6)

clojure.set/select

(clojure.set/select set-of-maps #(-> % :age (= 3)))

name"Reagan"类似。在这种情况下,返回值将是一个集合。

您也可以使用filter而无需任何特殊准备,因为filter在其集合参数上调用seq(编辑:正如我在输入时已经由ffriend描述的那样)

(filter #(-> % :age (= 3))) set-of-maps)

这里的返回值将是一个懒惰的序列。

如果你知道在集合中只有一个项目满足你的谓词,some会更有效率(因为它在找到匹配后不会处理任何其他元素):

(some #(if (-> % :age (= 3)) %) set-of-maps)

此处的返回值将是匹配元素。