我正在尝试使用地图中的值填充Clojure向量。 我在地图中有另一个特定键向量存储我需要的值。 我需要迭代key-vec,从地图中获取值并将它们存储在另一个向量中。
我尝试过使用loop + recur:
(let [keys-vec (:keys-vec item)
my-map (:my-map item)]
(loop [newV []
i 0]
(if (< i (count keys-vec))
(recur
(conj newV (get my-map (get keys-vec i)))
(inc i))
newV)))
它有效。 但我知道Clojure以其简约/高效的代码编写风格而闻名,我想知道是否有更好的方法。
有什么想法吗?
答案 0 :(得分:3)
我说,最惯用的方式是使用原始矢量。我没有看到任何明确克隆不可变数据结构的理由。
答案 1 :(得分:2)
您希望select-keys
功能仅从地图中提取感兴趣的键。请参阅:http://clojuredocs.org/clojure.core/select-keys
然后,使用vals
函数从过滤后的地图中提取所有值:
> (def my-map {:a 1 :b 2 :c 3})
> (def my-keys [:a :b])
> (select-keys my-map my-keys)
{:a 1, :b 2}
> (def filtered-map (select-keys my-map my-keys))
> filtered-map
{:a 1, :b 2}
> (vals filtered-map)
(1 2)
您应始终向Clojure Cheatsheet打开浏览器标签页。它对于找到您想要的功能非常有用。继续研究它,因为你会不断寻找新的东西多年。这是我最喜欢的版本:
http://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip-cdocs-summary.html
答案 2 :(得分:1)
(def my-map {:a 1 :b 2 :c 3})
(def my-keys [:a :b])
......一个简单快捷的解决方案
(mapv my-map my-keys)
;[1 2]
替代
(vals (select-keys my-map my-keys))
;(2 1)
......可能不会(并且在这种情况下,不会)维持my-keys
给出的顺序。