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}]

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

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

无法理解这一点,我知道如何解构矢量或单独的地图,但不是地图矢量,感谢任何帮助或见解。

4

1 回答 1

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)returns :foo)。

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

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

另见assoc-inupdate-in生成嵌套数据结构的修改版本。

于 2013-07-22T19:26:51.663 回答