Clojure映射数组
我试图在Clojure映射数组,clojure,Clojure,我试图在Clojure name: foo data: bar name: stack data: overflow name: tess data: ting 我想用地图,但你不能有重复的钥匙在那里,这样就不会工作 是否可以有一系列地图,类似于: [{name: foo, data: bar} {name: stack, data: overflow} {name: tess, data: ting}] 如果是,您将如何访问数据。例如,您将如何访问data:ov
Clojure
name: foo data: bar
name: stack data: overflow
name: tess data: ting
我想用地图,但你不能有重复的钥匙在那里,这样就不会工作
是否可以有一系列地图,类似于:
[{name: foo, data: bar}
{name: stack, data: overflow}
{name: tess, data: ting}]
如果是,您将如何访问数据。例如,您将如何访问data:overflow
您需要使用嵌套的get
语句吗?首先,{:name“foo”:data“overflow”}
,这是EDN,不是JSON
其次,是的,可以(defmap数组[{:name“foo”}{:name“bar”}])
要访问字段,可以使用get
和get-in
:
.
您还可以通过以下方式使用filter
功能:
(first (filter #(= "foo" (:name %)) map-array))
=> {:name "foo"}
编辑:
如果您想摆脱filter
to并获得对地图的恒定访问时间,您应该使用某种uniq ID:
(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"
首先,{:name“foo”:data“overflow”}
,这是EDN,不是JSON
其次,是的,可以(defmap数组[{:name“foo”}{:name“bar”}])
要访问字段,可以使用get
和get-in
:
.
您还可以通过以下方式使用filter
功能:
(first (filter #(= "foo" (:name %)) map-array))
=> {:name "foo"}
编辑:
如果您想摆脱filter
to并获得对地图的恒定访问时间,您应该使用某种uniq ID:
(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"
也许我遗漏了一些东西,但看起来好像你正在重新创建一个地图,在这里你想要的不是键和值,而是名称和数据。例如,以下内容足以为地图建模:
(get {"foo" "bar" "stack" "overflow" "tess" "ting"} "stack")
=> "overflow"
现在,如果您的数据更复杂,您当然可以在某个键下存储地图。
换句话说,您构建了一个映射,其中键是与每个数据关联的名称。假设你有这样一个向量:
(def data [{:name "foo" :data "bar"}
{:name "stack" :data "overflow"}
{:name "tess" :data "ting"}])
要获得相应的地图,可以执行以下操作:
(reduce (fn [m d] (assoc m (:name d) d)) {} data)
。。。其中:
{"tess" {:name "tess" , :data "ting"},
"stack" {:name "stack", :data "overflow"},
"foo" {:name "foo" , :data "bar"}}
也许我遗漏了一些东西,但看起来好像你正在重新创建一个地图,在这里你想要的不是键和值,而是名称和数据。例如,以下内容足以为地图建模:
(get {"foo" "bar" "stack" "overflow" "tess" "ting"} "stack")
=> "overflow"
现在,如果您的数据更复杂,您当然可以在某个键下存储地图。
换句话说,您构建了一个映射,其中键是与每个数据关联的名称。假设你有这样一个向量:
(def data [{:name "foo" :data "bar"}
{:name "stack" :data "overflow"}
{:name "tess" :data "ting"}])
要获得相应的地图,可以执行以下操作:
(reduce (fn [m d] (assoc m (:name d) d)) {} data)
。。。其中:
{"tess" {:name "tess" , :data "ting"},
"stack" {:name "stack", :data "overflow"},
"foo" {:name "foo" , :data "bar"}}