解构地图矢量

时间:2013-07-22 19:23:27

标签: clojure

我有一个函数可以查询我的数据库中最近的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}]

我如何解构地图矢量(或者是否有更好的方法?)以便我可以将每个值绑定到符号中的符号:

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

无法解决这个问题,我得到了如何解构矢量或单独绘制地图,但不是地图矢量,感谢任何帮助或见解。

1 个答案:

答案 0 :(得分:3)

这根本不可能,因为解构会创建名称必须静态知道的本地绑定。

除非提前知道地图总数,否则你当然可以写

(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)。

或者您可以直接将vector-of-mapsget-in

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

另请参阅assoc-inupdate-in以生成嵌套数据结构的修改版本。