(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