我有一个结果({: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
?
谢谢
答案 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文章非常棒,可以解释更多细节!