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

时间:2018-06-03 19:14:40

标签: clojure

这类似于Clojure get map key by value

但是,有一点不同。如果hm像

,你会怎么做同样的事情?
{1 ["bar" "choco"]}

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

我试过这样的事,但它没有用。

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

(keep #(when (= ((nth val 0) %) "bar")
         (key %))
      hm)

3 个答案:

答案 0 :(得分:6)

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

(ffirst (filter (fn [[k [v & _]]] (= "bar" v)) hm))

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

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

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

答案 1 :(得分:6)

使用some执行此操作的另一种方法:

(some (fn [[k [v & _]]] (when (= "bar" v) k)) hm)

你的例子非常接近于工作,并做了一些小改动:

(keep #(when (= (nth (val %) 0) "bar")
         (key %))
       hm)

keepsome相似,但some只返回一个结果。

答案 2 :(得分:3)

除了上述所有(正确)答案之外,您还可以将地图重新​​索引到所需的格式,特别是如果频繁调用搜索操作并且初始地图相当大,这样可以减少搜索复杂度从线性到常数:

class Bar extends Component {
    render(){
        return(
            {
                this.props.bars.map((bar)=>{
                    return <div>{bar}<div/>
                })
            }
        )
    }
}