如何使用clojure从数组中获取第一个元素映射

How to get first element map from an array using clojure

我有一组结果 ({:a one})。当我 select 或给出 :a.

时,我想要一个 return 的结果

我使用了 vals,get-in 函数,但由于地图在列表中,所以它们无法正常工作。你能帮我看看我该怎么做吗?

我需要 return 给定键的值。

此外,

如果数据是这样的形式怎么办

({:a “Favorite fruit", :measurements [{:a “fav game?", :b "x",
:name “foot ball", :max 7.0, :min 0.0, :id “12345"}], :name “Frequency”})

我想 select :a "fav game?" :name "foot ball":min 0.0 ?

谢谢

试试这个:

clj.core=> (def data [ {:a 1} {:b 2} ] )
#'clj.core/data
clj.core=> (:a (first data))
1
clj.core=> (mapv :a data)
[1 nil]

如果您有一个结果向量(通常比列表更惯用),您可以使用 get in,但使用数字作为键。例如

(get-in [{:a "one"}] [0 :a])  ;=> "one"

列表理解

列表理解使用 for 和列表中任意数量的元素:

(for [x data :let [m (:measurements x)]] (map #(let [{:keys [a name min]} %] [a name min]) m))

详情:

  • for [x data 数据中的每个元素
  • :let [m (:measurements x)]] 设置 m 作为 :measurements
  • 的符号
  • (map #(let [{:keys [a name min]} %] [a name min]) m) 对于每个 m 获取键 a name min 并输出向量 [a name min].

输出:

((["fav name?" "foot ball" 0.0]))

或一个结果

直接使用apply:

(let [{:keys [a name min]} (apply (comp first :measurements) data)] [a name min])

详情:

  • (apply (comp first :measurements) data) 应用 comp 位置,首先得到 :measurements 然后 first 元素。
  • let [{:keys [a name min]} 从映射中获取键 a name min 并输出向量 [a name min].

输出:

["fav name?" "foot ball" 0.0]

要添加到@Marcs 的答案(以及一些额外的 Clojure 帮助),还有一些方法可以使用 destructuring 提取值。

从你举的例子开始

(def foobar
  {:a "Favorite fruit", :measurements [{:a "fav game?", :b "x",
   :name "foot ball", :max 7.0, :min 0.0, :id "12345"}], :name "Frequency"})

我们可以进行关联解构,因为 Clojure 映射是关联数据结构

;; associative destructuring
(let [{:keys [a]} foobar]
  a)

;; also associative destructuring in the function params this time
((fn [{:keys [a]}]
   a)
 foobar)

要从包裹在数组中的映射中获取单个值,我们可以结合使用顺序解构和关联解构

(let [[{:keys [a]}] '({:a 'one})]
  a)

对于你问的关于获取 :a :name :min 的最后一部分,我们可以使用另一个解构组合

(let [{a :a [{min :min}] :measurements name :name} foobar]
  [a name min])

我链接到的那篇 clojure.org 文章非常棒,可以解释更多细节!