2012-08-18 52 views
4

Clojure的初學者在這裏..的Clojure集地圖 - 基本的過濾

如果我有一組地圖,如

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

我知道我能得到象這樣

(map :name kids) 

1)如何選擇特定的地圖?例如 我想找回名稱=「里根」的地圖。

{:name "Reagan" :age 1.5} 

這可以使用過濾器來完成嗎?

2)如何返回年齡= 3的名稱?

回答

8

是的,你可以用filter做到這一點:

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

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

clojure.set/select

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

而與此類似。這種情況下的返回值將是一個集合。

你也可以使用filter沒有任何特殊的準備,因爲filter電話seq它收集參數(編輯:作爲已經ffriend描述我打字這一段時間)

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

這裏的返回值將是一個懶惰的seq。

如果你知道只會有組中的一個滿足你的謂語項,some效率會更高(因爲它不會找到匹配後處理任何其他元素):

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

返回值這裏將是匹配元素。

+0

感謝懶惰的seqs,你也可以做'(first(filter ...'efficient。 – 2012-08-18 19:05:38

+0

真的,我想我主要更喜歡它作爲更自我記錄的選項(對我來說,無論如何)。雖然(由於塊),昂貴的謂詞邊緣。 – 2012-08-18 21:05:00