Clojure:如何按值从向量中检索哈希值

时间:2015-11-24 19:34:26

标签: clojure

我正在尝试根据哈希值是否在字段中具有特定值来从哈希矢量中检索整个哈希值。

(def foo {:a 1, :b 2})
(def bar {:a 3, :b 4})
(def baz [foo bar])

baz中,我想将整个哈希值返回到:a 3,结果将是{:a 3, :b 4}。我尝试了get get-infind,但这些依赖于密钥而不返回整个哈希。我也尝试了this question的一些建议,但他们也没有返回哈希。

2 个答案:

答案 0 :(得分:2)

过滤救援!

hello.core> (def foo {:a 1, :b 2})
#'hello.core/foo
hello.core> (def bar {:a 3, :b 4})
#'hello.core/bar
hello.core> (def baz [foo bar])
#'hello.core/baz

hello.core> (filter #(= (:a %) 3) baz)
({:a 3, :b 4})

#(= (:a %) 3)是一个简短形式,用于创建一个匿名,它接受一个名为%的参数,在该参数中,它将查找键:a,如果匹配值3,则返回true通过此测试的向量baz中的任何条目都将使其成为输出。

PS:关于发音的注释:该数据结构通常称为“地图”,因为它将一个键映射到一个值。这非常令人困惑,因为还有一个名为map的函数,它通过函数更改序列的每个成员。

答案 1 :(得分:2)

filter肯定能像Arthur提到的那样完成工作。仅仅为了完整起见,这些是另外两个与filter

有两个不同的解决方案
(some #(when (= 3 (:a %)) %) baz)
(first (drop-while #(not= 3 (:a %)) baz))
  1. 一旦他们找到符合您要求的集合中的第一个元素(因此资源较少),这些将停止进一步搜索您的整个集合
  2. 因为这个原因,与过滤器相反,它们只给你第一个装配元素而不是集合中所有通过你的元素 要求(如果您的集合中有多个重复元素)。