迭代 clojure 中对象的 PersistentVector

问题描述

我是 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-case 中的 clojure.string)获取电子邮件的结果:(注意 comp 中的排序) :

(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,上面的方法更容易理解。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...