通过Clojure中的值列表中的第一个元素获取密钥

sma*_*aug 0 clojure

这类似于Clojure get map key by value

但是,有一点不同.如果像hm那样你会怎么做同样的事情

{1 ["bar" "choco"]}
Run Code Online (Sandbox Code Playgroud)

想法是获得1(键)第一个元素,如果值列表是"bar"?如果其他问题得到解答,请随时关闭/合并此问题.

我试过这样的东西,但它不起作用.

(def hm {:foo ["bar", "choco"]})

(keep #(when (= ((nth val 0) %) "bar")
         (key %))
      hm)
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 6

您可以过滤地图并返回结果序列中第一个项目的第一个元素:

(ffirst (filter (fn [[k [v & _]]] (= "bar" v)) hm))
Run Code Online (Sandbox Code Playgroud)

您可以对矢量值进行解构以访问第二个和/或第三个元素,例如

(ffirst (filter (fn [[k [f s t & _]]] (= "choco" s)) 
                {:foo ["bar", "choco"]}))
Run Code Online (Sandbox Code Playgroud)

通过前几个元素,您可能会发现它们nth更具可读性.


Tay*_*ood 6

另一种方法是使用some:

(some (fn [[k [v & _]]] (when (= "bar" v) k)) hm)
Run Code Online (Sandbox Code Playgroud)

您的示例非常接近工作,并进行了一些小的更改:

(keep #(when (= (nth (val %) 0) "bar")
         (key %))
       hm)
Run Code Online (Sandbox Code Playgroud)

keep并且some类似,但some只返回一个结果.