我有一个函数可以查询我的数据库中最近的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
无法解决这个问题,我得到了如何解构矢量或单独绘制地图,但不是地图矢量,感谢任何帮助或见解。
答案 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-maps
与get-in
:
;; get ID from first map
(get-in vector-of-maps [0 :itemID])
另请参阅assoc-in
和update-in
以生成嵌套数据结构的修改版本。