Clojure - return 现有的具有副作用的新序列
Clojure - return new sequence from existing with side effect
我遇到了 运行 遇到的问题,但不确定如何处理。基本上,我有一个数据库调用,其中 returns 一系列地图。我需要对每个地图的特定元素应用更改,然后取回一个新序列,其中所有值都相同,但我已更改的值除外。
我目前有以下内容,它遍历序列并打印出来,但我不确定如何实际构建新的。
(defn find-character-by-id []
(let [
character (mc/find-maps db "characters" {:user_id "5b4403d3c1025107593fa0b4" })
]
(doseq [s character]
(println s))))
示例地图可能是:
{:_id #object[org.bson.types.ObjectId 0x74bb0de6 5b467e5bc102511a1729a0f1], :user_id 5b4403d3c1025107593fa0b4, :value 20}
我现在的目标是能够应用自定义函数来将 _id 覆盖到字符串,但我可能还想向值添加任意数量的值,因此最好是通用的。
如果您想使用某些 to-str
函数将每个 :_id
转换为字符串,您可以这样写:
(mapv ; Turn characters into a modified vector
#(update % :_id to-str) ; by updating each map :_id using to-str
characters)
我在每张地图上 map
ping,然后 update
通过将 to-str
应用于每个 :_id
val update
ing 每个地图的 :_id
。 =23=]
任何时候您想要将一个列表转换为另一个长度相等的列表,请使用 map
或 mapv
。如果您需要一些过滤功能,也可以使用 for
。
任何时候您想要根据其旧值更改与映射中的键关联的值,请使用 update
。
我只是把两者结合起来。
doseq
实际上只应在您无意创建新列表的情况下进行迭代时使用,或者您正在创建的新列表是通过某些突变创建的。它没有评估任何有用的东西。
我遇到了 运行 遇到的问题,但不确定如何处理。基本上,我有一个数据库调用,其中 returns 一系列地图。我需要对每个地图的特定元素应用更改,然后取回一个新序列,其中所有值都相同,但我已更改的值除外。
我目前有以下内容,它遍历序列并打印出来,但我不确定如何实际构建新的。
(defn find-character-by-id []
(let [
character (mc/find-maps db "characters" {:user_id "5b4403d3c1025107593fa0b4" })
]
(doseq [s character]
(println s))))
示例地图可能是:
{:_id #object[org.bson.types.ObjectId 0x74bb0de6 5b467e5bc102511a1729a0f1], :user_id 5b4403d3c1025107593fa0b4, :value 20}
我现在的目标是能够应用自定义函数来将 _id 覆盖到字符串,但我可能还想向值添加任意数量的值,因此最好是通用的。
如果您想使用某些 to-str
函数将每个 :_id
转换为字符串,您可以这样写:
(mapv ; Turn characters into a modified vector
#(update % :_id to-str) ; by updating each map :_id using to-str
characters)
我在每张地图上 map
ping,然后 update
通过将 to-str
应用于每个 :_id
val update
ing 每个地图的 :_id
。 =23=]
任何时候您想要将一个列表转换为另一个长度相等的列表,请使用 map
或 mapv
。如果您需要一些过滤功能,也可以使用 for
。
任何时候您想要根据其旧值更改与映射中的键关联的值,请使用 update
。
我只是把两者结合起来。
doseq
实际上只应在您无意创建新列表的情况下进行迭代时使用,或者您正在创建的新列表是通过某些突变创建的。它没有评估任何有用的东西。