gpt4 book ai didi

clojure - 解构 map 向量

转载 作者:行者123 更新时间:2023-12-04 04:48:36 29 4
gpt4 key购买 nike

我有一个函数可以查询我的数据库中最近的 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-maps直接与 get-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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com