2016-02-29 78 views

回答

4

我寧願用some(因爲它比使用filter我想更合乎邏輯的,因爲它的目的是找到一個值):

(def data 
    [{:id 1 :name "Bob"} 
    {:id 2 :name "Jane"} 
    {:id 3 :name "Greg"}]) 

(defn name-by-id [id data] 
    (some #(when (= (:id %) id) (:name %)) data)) 

user> 
(name-by-id 3 data) 
"Greg" 
user> 
(name-by-id 100 data) 
nil 
+1

我沒有運行任何基準測試,但'some'可能比'(comp first filter)'更快,因爲它不會創建中間的lazy-seq。 (請注意,'data'不是答案中的懶惰seq,但它可能在OP的版本中。) – muhuk

+0

我想是的。但首先它是專門爲這個確切的任務而設計的 – leetwinski

0
(def names 
    [{:id 1 :name "Bob"} 
    {:id 2 :name "Jane"} 
    {:id 3 :name "Greg"}]) 

;;get the :name where :id=3 
(defn answer [] 
    (:name (first (filter (fn [e] (= 3 (:id e))) names)))) 

在上面,而不是names你可以有moo

1

一種方法是使用一個filter

(def moos 
    [{:id 1 :name "Bob"} 
    {:id 2 :name "Jane"} 
    {:id 3 :name "Greg"}]) 

(defn name-for-id 
    [id] 
    (:name (first (filter #(= (:id %) id) moos)))) 

(name-for-id 3) ; => "Greg"