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"}}