这类似于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)
答案 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)
keep
和some
相似,但some
只返回一个结果。
答案 2 :(得分:3)
除了上述所有(正确)答案之外,您还可以将地图重新索引到所需的格式,特别是如果频繁调用搜索操作并且初始地图相当大,这样可以减少搜索复杂度从线性到常数:
class Bar extends Component {
render(){
return(
{
this.props.bars.map((bar)=>{
return <div>{bar}<div/>
})
}
)
}
}