[英]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.