2012-07-26 35 views
4

鑑於鍵多懶序列插入地圖

:id 
:tag 
:name 

和形式產生輸出三個懶漢序列

(id1 id2 id3 ...) 
(name1 name2 name3 ...) 
(type1 type2 type3 ...) 

什麼做我必須做這樣的形式獲取地圖的序列

({id: id1 :name name1 :type type1} 
{id: id2 :name name2 :type type2} 
{id: id3 :name name3 :type type3} 
...) 

我嘗試了apply,map,assoc等的各種組合,但沒有得到它。

+0

這三個答案都適用於我。感謝clojure新手。 – mmoehring 2012-07-27 19:21:20

回答

11

你只需要map

(map (fn [id name type] {:id id :name name :type type}) 
    (id1 id2 id3 ...) 
    (name1 name2 name3 ...) 
    (type1 type2 type3 ...)) 
1

我會去用:

(map hash-map (repeat :id) seq1 (repeat :name) seq2 (repeat :type) seq3) 

假設SEQ1,SEQ2和SEQ3是包含後續鍵值,你懶的序列。

6

我的答案與mtyaka的答案非常相似,但在我看來,它稍微短一些,而且更加模塊化。

(map (fn [& vs] (zipmap [:id :name :type] vs)) 
    (id1 id2 id3 ...) 
    (name1 name2 name3 ...) 
    (type1 type2 type3 ...)) 

這裏,zipmap期間的「第二步驟」創建使用固定密鑰序列和可變值序列,其在「第一步」將是(id1 name1 type1),地圖將(id2 name2 type2)

這隻有在你的三個懶惰序列彼此隔離時纔有效。如果你有懶惰序列,即((id1 id2 ...) (name1 name2 ...) (type1 type2 ...))的序列,那麼你將不得不apply上述本SEQ,像這樣:

(apply map (fn [& vs] (zipmap [:id :name :type] vs)) 
     ((id1 id2 id3 ...) 
     (name1 name2 name3 ...) 
     (type1 type2 type3 ..))) 

這裏,apply簡單代碼map (fn [& vs] (zipmap [:id :name :type] vs))預先考慮到的序列的前懶序列,併成爲一個表達式進行評估。換句話說,它產生與第一代碼塊完全相同的表達式。