clojure - 解构 map 向量

标签 clojure

我有一个函数可以在我的数据库中查询 X 个最近的条目,它返回一个 map 向量,如下所示:

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

我如何解构 map 向量(或者有更好的方法吗?),以便我可以沿着以下行将每个值绑定(bind)到符号中:

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

在理解这一点时遇到困难,我了解了如何解构矢量或单独的 map ,但不是 map 的矢量,感谢任何帮助或见解。

最佳答案

这根本不可能,因为解构会创建本地绑定(bind),其名称必须静态已知。

除非提前知道 map 总数,在这种情况下你当然可以写

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

可以在宏中捕获该模式,但结果可能不太漂亮。 (例如,引入隐式绑定(bind)并不是很漂亮。)

更好的解决方案可能是收集单独向量中的各种值:

(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) 来引用第一个 map 中的 ID,(categories 2) 来引用第三个 map 中的类别,等等。

这是有效的,因为 Clojure 中的向量充当索引函数,返回关联值(例如,([:foo :bar] 0) 返回 :foo) .

或者您可以直接将vector-of-mapsget-in一起使用:

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

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

关于clojure - 解构 map 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795716/

相关文章:

clojure - 我应该在哪里保存简单的配置设置?

Clojure 访问 Java 接口(interface)常量

java - 缺少 Clojure 库(所以使用 Java)...?

Clojure 重新加载工作流程而不使用组件之类的库?

clojure - 为什么 Clojure 不允许我们无序地编写函数?

recursion - 递归实体规范

clojure - 在 Clojure 和其他 Lisp 方言中,在函数名称末尾使用星号的约定是什么?

clojure - 了解 Clojure 中的 STM 属性

json - 在clojure中访问POST json

clojure - 重用多方法的解构