2013-07-22 36 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