填充 Clojure 向量

Fill a Clojure vector

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

有什么想法吗?

我会说,最惯用的方法是使用原始向量。我看不出有任何理由显式克隆不可变数据结构。

您希望 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 备忘单。它对于找到您想要的功能非常有用。继续反复研究它,因为您会在多年内不断发现新事物。这是我最喜欢的版本:

http://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip-cdocs-summary.html

使用

(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.

给出的顺序