如何使用clojure从数组中获取第一个元素映射
How to get first element map from an array using clojure
我有一组结果 ({:a one})
。当我 select 或给出 :a
.
时,我想要一个 return 的结果
我使用了 vals,get-in
函数,但由于地图在列表中,所以它们无法正常工作。你能帮我看看我该怎么做吗?
我需要 return 给定键的值。
此外,
如果数据是这样的形式怎么办
({:a “Favorite fruit", :measurements [{:a “fav game?", :b "x",
:name “foot ball", :max 7.0, :min 0.0, :id “12345"}], :name “Frequency”})
我想 select :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]
如果您有一个结果向量(通常比列表更惯用),您可以使用 get in,但使用数字作为键。例如
(get-in [{:a "one"}] [0 :a]) ;=> "one"
列表理解
列表理解使用 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]
要添加到@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 文章非常棒,可以解释更多细节!
我有一组结果 ({:a one})
。当我 select 或给出 :a
.
我使用了 vals,get-in
函数,但由于地图在列表中,所以它们无法正常工作。你能帮我看看我该怎么做吗?
我需要 return 给定键的值。
此外,
如果数据是这样的形式怎么办
({:a “Favorite fruit", :measurements [{:a “fav game?", :b "x",
:name “foot ball", :max 7.0, :min 0.0, :id “12345"}], :name “Frequency”})
我想 select :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]
如果您有一个结果向量(通常比列表更惯用),您可以使用 get in,但使用数字作为键。例如
(get-in [{:a "one"}] [0 :a]) ;=> "one"
列表理解
列表理解使用 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]
要添加到@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 文章非常棒,可以解释更多细节!