2016-08-31 27 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給出的順序。