Clojure - 从一个哈希映射的向量中提取值

9

今天下午我绞尽脑汁地想着这个问题。我对Clojure和Lisp都比较陌生。我有一个数据结构,它是一个映射向量,我想从所有映射中获取特定键的所有值到另一个向量中。

例如,假设这是绑定到myvec的映射向量:

[ { "key1" "value1" "key2" "value2"} {"key1" "value3" "key2" "value4"} ]

我希望得到一个向量,看起来像这样:

[ "value1" "value3" ]

由键“key1”的所有值组成

我能想到的唯一方法是

(for [i (range (count(myvec)))] ((myvec i) "key1"))

有没有更简单的方法?似乎一定有。

谢谢。
2个回答

22

(map #(get % "key1") myvec)应该就是你需要的。


谢谢。正是我想要的。我正在从查询中提取键和值。我得到类似“State: Closed”的返回结果,并设置了一个哈希映射,如{"State" "Closed"}。这就是为什么我没有使用:关键字的原因。或者还有其他使用关键字的方法吗? - Dave Kincaid
删除了我之前的评论,建议将字符串转换为关键字。9年前我认为这是个好主意,但现在不再这样认为了。关键字最好用于源文件中的文字。如果你从外部获取数据,请将它们保留为字符串。 - amalloy

10
(let [v [{"key1" "value1", "key2" "value2"} {"key1" "value3", "key2" "value4"}]]
  (vec (map #(% "key1") v)))

如果您使用关键字作为键:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"}]]
  (vec (map :key1 v)))
如果你不想在地图中没有给定的键时包含nil值:
(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"} {:key2 "value5"}]]
  (vec (keep :key1 v)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接