问题描述
我是 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,上面的方法更容易理解。