如何从 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)