Clojure Array von Karten
Ich versuche, diese Art von Daten in zu modellieren Clojure
name: foo data: bar
name: stack data: overflow
name: tess data: ting
Ich habe überlegt, eine Karte zu verwenden, aber Sie können dort keine doppelten Schlüssel haben, damit das nicht funktioniert.
Ist es möglich, eine Reihe von Karten zu haben, ähnlich wie:
[{name: foo, data: bar}
{name: stack, data: overflow}
{name: tess, data: ting}]
Wenn ja, wie würden Sie auf die Daten zugreifen? Wie würden Sie beispielsweise darauf zugreifen?data: overflow
Müssten Sie eine verschachtelte get
Anweisung verwenden?
Erstens ist {:name "foo" :data "overflow"}
dies EDN, nicht JSON;
Zweitens, ja, das ist in Ordnung (def map-array [{:name "foo"} {:name "bar"}])
Um den Zugriff auf Felder können Sie verwenden , get
und get-in
: https://clojuredocs.org/clojure.core/get-in .
(get-in map-array [1 :name])
=> "bar"
Sie können die filter
Funktion auch folgendermaßen verwenden :
(first (filter #(= "foo" (:name %)) map-array))
=> {:name "foo"}
BEARBEITEN: Wenn Sie filter
Ihre Karten loswerden und eine konstante Zugriffszeit erhalten möchten, sollten Sie eine Art Uniq-ID verwenden:
(def map-array {:id1 {:name "foo"}
:id2 {:name "bar"}})
(get-in map-array [:id1 :name])
=> "foo"
;; using threading macro and keyword special power:
(-> map-array :id2 :name)
=> "bar"