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

时间:2016-11-15 19:53:34

标签: clojure clojurescript

我有一个结果({:a one})数组。我想要一个在我选择或提供:a时返回一个结果的结果。

我使用了vals,get-in个函数,但由于地图位于列表中,因此无效。你能帮帮我怎么做。

我需要为给定的密钥返回值。

此外,

如果数据的格式为

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

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

谢谢

4 个答案:

答案 0 :(得分:4)

试试这个:

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

答案 1 :(得分:3)

列表理解

使用列表中任意数量元素的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]

答案 2 :(得分:2)

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

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

答案 3 :(得分: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文章非常棒,可以解释更多细节!