繁体   English   中英

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

[英]How to get first element map from an array using clojure

我有一个结果数组({: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

谢谢

尝试这个:

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

清单理解

使用列表中理解与列表中的元素中的任何数量:

(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 elem。
  • let [{:keys [a name min]}从映射中获取keys a name min ,并输出矢量[a name min]

输出:

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

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

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

要添加到@Marcs答案(以及一些其他Clojure帮助)中,也有几种使用解构来提取值的方法。

从您给出的示例开始

(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文章对于解释更多细节非常棒!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM