4

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)返回age = 3的名字怎么样?

4

2 回答 2

8

是的,你可以这样做filter

(filter #(= (:name %) "Reagan") kids)

(filter #(= (:age %) 3) kids)
于 2012-08-18T18:52:09.583 回答
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)

这里的返回值将是匹配的元素。

于 2012-08-18T18:56:03.087 回答