2016-02-29 51 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"