(def moo (my-func))
返回:
[{:id 1 :name "Bob"}
{:id 2 :name "Jane"}
{:id 3 :name "Greg"}]
我現在該如何訪問哞得到:name
哪裏:id=3
?謝謝。
(def moo (my-func))
返回:
[{:id 1 :name "Bob"}
{:id 2 :name "Jane"}
{:id 3 :name "Greg"}]
我現在該如何訪問哞得到:name
哪裏:id=3
?謝謝。
我寧願用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
(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
。
一種方法是使用一個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"
我沒有運行任何基準測試,但'some'可能比'(comp first filter)'更快,因爲它不會創建中間的lazy-seq。 (請注意,'data'不是答案中的懶惰seq,但它可能在OP的版本中。) – muhuk
我想是的。但首先它是專門爲這個確切的任務而設計的 – leetwinski