填写Clojure向量

时间:2016-08-31 07:26:53

标签: arrays vector clojure fill idiomatic

我正在尝试使用地图中的值填充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以其简约/高效的代码编写风格而闻名,我想知道是否有更好的方法。

有什么想法吗?

3 个答案:

答案 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)

使用Alan Thompson's example

(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给出的顺序。