遍历 clojure 中对象的 PersistentVector

iterate over PersistentVector of objects in clojure

我是 Clojure 的新手,我正在尝试迭代对象的 PersistentVector,当我在日志中打印时,它如下所示。

[{name John, email john@example.com} {name Peter, email peter@example.com}]

当我打印(输入 myData)时,它告诉我它是 clojure.lang.PersistentVector

类型

我必须迭代这个向量,一次从其中的每个对象中提取电子邮件并调用另一个函数。

它看起来很简单,我看了很多示例和问题,但似乎没有什么适合我:(

谢谢。

这里有几个选项:

如果您不关心对象(Clojure 中的“地图”)并且只想收集电子邮件并对其应用函数,您可以创建一个简单的函数来将电子邮件提取到另一个集合中然后对电子邮件集合使用任何函数:

(def items
  [{"name" "John", "email" "john@example.com"} {"name" "Peter", "email" "peter@example.com"}])

(defn get-email [m]
  (get m "email"))

(mapv get-email items)
;; returns: ["john@example.com", "peter@example.com"]

您可以使用函数组合来创建一个函数,该函数将变成大写字母(使用 upper-caseclojure.string)获取电子邮件的结果:(注意 [=15= 中的顺序]):

(mapv (comp clojure.string/upper-case get-email) items)
;; returns ["JOHN@EXAMPLE.COM" "PETER@EXAMPLE.COM"]

如果你想获得一个类似的集合但更新了电子邮件字段,你可以使用update-in:

(mapv (fn [m] (update-in m ["email"] clojure.string/upper-case)) items)
;; Applies `upper-case` to the "email" path of each map identified by `m`.
;; returns: [{"name" "John", "email" "JOHN@EXAMPLE.COM"} {"name" "Peter", "email" "PETER@EXAMPLE.COM"}]

使用其他技术(匿名函数、strs 解构)有更优雅的方法来完成相同的工作,但我认为如果您是 Clojure 的新手,上述方法更容易理解。