如何从 Clojure 数组中的键中获取特定值?
How to get specific value from key in Clojure Array?
我在 clojure 中的数据定义为:
(def data {:actor "damas.nugroho"
:current-attributes [{:key "name", :value "adam"}
{:key "city", :value "jakarta"}]})
我想获取城市值,即雅加达。我该怎么做?
这是您拥有的数据:
(def data
{:actor "damas.nugroho"
:current-attributes [{:key "name", :value "adam"}
{:key "city", :value "jakarta"}]})
这就是您到达城市的方式:
(->> (:current-attributes data)
(some #(when (= (:key %) "city")
(:value %))))
但是 :current-attributes
的值本质上看起来像一张地图。假设按键不重复,考虑将其转换为地图以便于操作。
(def my-new-data
(update data :current-attributes
#(into {} (map (juxt :key :value)) %)))
my-new-data
最终会变成这样:
{:actor "damas.nugroho"
:current-attributes {"name" "adam"
"city" "jakarta"}}
获取城市只是一个嵌套的地图查找,可以用 (get-in my-new-data [:current-attributes "city"])
完成
此外,:current-attributes
不是特定的,除非它可能包含 :actor
作为键,或者在某些上下文中具有您关心的特定含义,否则可以展平。
此外,假设current-attributes
中的键名是程序名,并遵循Clojure中关键字的语法,您可以将它们转换为关键字,并将它们全部倒入一个映射中:
(def my-newer-data
(let [attrs (into data
(map (juxt (comp keyword :key) :value))
(:current-attributes data))]
(dissoc attrs :current-attributes)))
现在我们得到这个:
{:actor "damas.nugroho", :name "adam", :city "jakarta"}
提取城市就是这么说的,(:city my-newer-data)
我在 clojure 中的数据定义为:
(def data {:actor "damas.nugroho"
:current-attributes [{:key "name", :value "adam"}
{:key "city", :value "jakarta"}]})
我想获取城市值,即雅加达。我该怎么做?
这是您拥有的数据:
(def data
{:actor "damas.nugroho"
:current-attributes [{:key "name", :value "adam"}
{:key "city", :value "jakarta"}]})
这就是您到达城市的方式:
(->> (:current-attributes data)
(some #(when (= (:key %) "city")
(:value %))))
但是 :current-attributes
的值本质上看起来像一张地图。假设按键不重复,考虑将其转换为地图以便于操作。
(def my-new-data
(update data :current-attributes
#(into {} (map (juxt :key :value)) %)))
my-new-data
最终会变成这样:
{:actor "damas.nugroho"
:current-attributes {"name" "adam"
"city" "jakarta"}}
获取城市只是一个嵌套的地图查找,可以用 (get-in my-new-data [:current-attributes "city"])
完成
此外,:current-attributes
不是特定的,除非它可能包含 :actor
作为键,或者在某些上下文中具有您关心的特定含义,否则可以展平。
此外,假设current-attributes
中的键名是程序名,并遵循Clojure中关键字的语法,您可以将它们转换为关键字,并将它们全部倒入一个映射中:
(def my-newer-data
(let [attrs (into data
(map (juxt (comp keyword :key) :value))
(:current-attributes data))]
(dissoc attrs :current-attributes)))
现在我们得到这个:
{:actor "damas.nugroho", :name "adam", :city "jakarta"}
提取城市就是这么说的,(:city my-newer-data)