2016-08-31 28 views
0

我想用地图中的值填充Clojure矢量。 我有地图中的特定键的另一个向量存储我需要的值。 我需要迭代key-vec,从地图获取值并将它们存储在另一个向量中。填写Clojure矢量

我的使用环路+ 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以其简约/高效的代码书写风格而闻名,我想知道是否有更好的方法。

任何想法?

+1

你能指定你试图实现什么吗? '(def new-vector existing-vector)'不是解决问题吗? – superkonduktr

+2

我相信它接近于Clojure中的一种反模式,它使用循环和元素索引遍历一个向量,因为Clojure的集合是不可变的,持久的。相反,鼓励您使用减少功能。完成任务的惯用方式只是'(vals(select-keys my-map keys-vec))''。 – superkonduktr

+0

你是对的,它的工作。谢谢! –

回答

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

+0

它的工作!谢谢 –

3

我会说,最习惯的方式将是使用原始矢量。我没有看到明确克隆不可变数据结构的任何理由。

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