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)

我在每张地图上 mapping,然后 update 通过将 to-str 应用于每个 :_id val updateing 每个地图的 :_id。 =23=]

任何时候您想要将一个列表转换为另一个长度相等的列表,请使用 mapmapv。如果您需要一些过滤功能,也可以使用 for

任何时候您想要根据其旧值更改与映射中的键关联的值,请使用 update

我只是把两者结合起来。

doseq 实际上只应在您无意创建新列表的情况下进行迭代时使用,或者您正在创建的新列表是通过某些突变创建的。它没有评估任何有用的东西。