2013-07-22 35 views
2

我有一個查詢我的數據庫爲X最近的條目的功能,它會返回地圖的線沿線的向量的向量:解構地圖

[{:itemID "item1" 
:category "stuff" 
:price 5} 
{:itemID "item2" 
:category "stuff" 
:price 54} 
{:itemID "item3" 
:category "stuff" 
:price 435} 
{:itemID "item4" 
:category "otherstuff" 
:price 32}] 

我如何去解構的載體地圖(或者是有一個更好的方法?),這樣我可以沿行的每個值綁定成一個符號:遇到問題所著的Grokking這

item-1-id 
item-1-category 
item-1-cost 
item-2-id 
item-2-category 
item-2-price 
...etc 

,我得到如何解構的載體,或單獨的地圖,但不矢量地圖,感謝任何幫助或見解。

回答

2

這是根本不可能的,因爲解構創建的本地綁定的名稱必須是靜態的。

那除非地圖的總數是事先已知的,在這種情況下,你當然可以寫

(let [[{item-1-id :itemID ...} {item-2-id :itemID} ...] ...] ...) 

該模式可以在宏被捕獲,但結果可能不會很漂亮。 (例如,引入隱式綁定不是很漂亮。)

更好的解決方案可能是收集在分開的載體中的各種值:

(let [vector-of-maps (get-the-vector-of-maps) 
     ids   (mapv :itemID vector-of-maps) ;; note the mapv 
     categories  (mapv :category vector-of-maps) 
     ...] 
    ...) 

然後就可以說(ids 0)指從所述ID第一地圖,(categories 2)指的類別從第三地圖等

此操作,因爲在Clojure的行爲作爲指標的功能,並返回相關值向量(例如,([:foo :bar] 0)返回:foo)。

或者你可以簡單地用get-in直接使用vector-of-maps

;; get ID from first map 
(get-in vector-of-maps [0 :itemID]) 

參見assoc-inupdate-in生產嵌套數據結構的修改版本。

+0

感謝細節,這讓我很清楚發生了什麼事情。一個問題,雖然玩你的示例解決方案,我得到clojure.lang.ArityException:錯誤數量的參數(0)傳遞給:PersistentVector,任何想法? – VFe

+0

顯然你正在調用一個沒有參數的向量。矢量只能被稱爲一元函數(使用單個索引參數)。 –

+0

謝謝,我(拼湊)弄明白了,將矢量地圖變成自己的def,然後通過mapv完成所有符號的綁定。這是一個驚人的幫助,謝謝:) – VFe