Clojure - 从散列图矢量中提取值

Dav*_*aid 8 clojure

今天下午我的大脑正在试图弄清楚这个.我对Clojure和Lisp很新.我有一个数据结构,它是一个地图矢量,我希望将所有地图中的特定键的所有值都放到另一个矢量中.

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

[ { "key1" "value1" "key2" "value2"} {"key1" "value3" "key2" "value4"} ]
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像的矢量

[ "value1" "value3" ]
Run Code Online (Sandbox Code Playgroud)

由密钥"key1"的所有值组成

我能想到的唯一方法是

(for [i (range (count(myvec)))] ((myvec i) "key1"))
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?好像一定有​​.

谢谢.

ama*_*loy 20

(map #(get % "key1") myvec)应该是你所需要的一切.考虑使用:关键字而不是"字符串"作为键,因为它通常更好,更惯用.另外,你可以这样写(map :key1 myvec)

  • 您可以使用`keyword`函数将字符串转换为关键字.如果你只在地图上看一次就不值得做,但是例如`(into {}(对于[[kv] mymap] [(关键字k)v]))`会将地图中的所有键转换为关键字(授予他们当前的字符串). (2认同)

Jus*_*mer 10

(let [v [{"key1" "value1", "key2" "value2"} {"key1" "value3", "key2" "value4"}]]
  (vec (map #(% "key1") v)))
Run Code Online (Sandbox Code Playgroud)

如果您为密钥使用关键字:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"}]]
  (vec (map :key1 v)))
Run Code Online (Sandbox Code Playgroud)

如果您不希望nil在地图没有给定键时包含值:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"} {:key2 "value5"}]]
  (vec (keep :key1 v)))
Run Code Online (Sandbox Code Playgroud)