Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-从现有序列返回新序列并产生副作用_Clojure_Maps_Seq - Fatal编程技术网

Clojure-从现有序列返回新序列并产生副作用

Clojure-从现有序列返回新序列并产生副作用,clojure,maps,seq,Clojure,Maps,Seq,我遇到了一个问题,不知道如何解决。基本上,我有一个数据库调用,它返回一系列映射。我需要对每个映射的一个特定元素应用一个更改,然后返回一个新的序列,该序列包含除我更改的值以外的所有相同值 我目前有以下内容,它遍历序列并打印它,但我不确定如何实际构建新序列 (defn find-character-by-id [] (let [ character (mc/find-maps db "characters" {:user_id "5b4403d3c1025107593fa0b4" }

我遇到了一个问题,不知道如何解决。基本上,我有一个数据库调用,它返回一系列映射。我需要对每个映射的一个特定元素应用一个更改,然后返回一个新的序列,该序列包含除我更改的值以外的所有相同值

我目前有以下内容,它遍历序列并打印它,但我不确定如何实际构建新序列

(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,但我可能还想在值中添加任意数量的值,这样通用的东西才是最好的

如果要使用some to str函数将每个:_id转换为字符串,可以编写:

(mapv ; Turn characters into a modified vector
  #(update % :_id to-str) ; by updating each map :_id using to-str
  characters)
我正在映射每个映射,然后通过将str应用于each:_idval来更新每个映射的:_id

当您想将一个列表转换为另一个长度相等的列表时,请使用map或mapv。如果需要一些过滤功能,也可以使用

任何时候,如果您想根据映射中某个键的旧值更改该键的关联值,请使用“更新”

我只是把两者结合起来


doseq实际上只应该在您进行迭代时使用,而不打算创建新列表,或者您正在创建的新列表是通过某种变异创建的。它的评估结果没有任何用处。

这非常有效!谢谢你的详细解释!