簡體   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