映射数组映射的嵌套向量
Map nested vector of array maps
我一直在尝试将向量中映射的嵌套值映射到向量的向量中,但没有成功。
我的数据是这样的:
[{:country {:name "chile", :id 1},
:subcountries [{:name "talca", :id 2}
{:name "concepcion", :id 3}
{:name "puerto montt", :id 4}]}
{:country {:name "united states", :id 5},
:subcountries [{:name "boston", :id 6}
{:name "texas", :id 7}]}]
虽然我一直在玩的代码含糊不清 returns 我试图得到的结果的近似值:
(map
(fn [x]
(let [{{id :id name :name} :country
subcountries :subcountries} x]
[id
name
(map (fn [y] (let [{yid :id yname :yname} y] [yid yname])))]))
data)
我收到的结果很奇怪,因为我想要的向量只是一个函数:
([1 "chile" #function[clojure.core/map/fn--5862]]
[5 "united states" #function[clojure.core/map/fn--5862]])
我做错了什么?
预期输出应该是这样的:
[[["chile" 1] ["talca" 2] ["concepcion" 3] ["puerto montt" 4]]
[["united states" 5] ["boston" 6] ["texas" 7]]]
您在矢量输出中看到该函数的原因是您的内部 map
没有将该函数应用于任何数据结构,因此它返回了一个转换器。
我在这里更新了内部 map
以将函数映射到子国家/地区,我认为这是您的意图。 (还有一个小错字,你用的是 yname :yname
而不是 yname :name
)
(defn f [data]
(mapv
(fn [x]
(let [{{id :id name :name} :country
subcountries :subcountries} x]
[id
name
(mapv (fn [y] (let [{yid :id yname :name} y] [yid yname])) subcountries)]))
data))
不确定这是否正是您想要的输出,因为您说过 "something like..."。如果没有,请告诉我们您是否需要更多帮助才能完成剩下的工作。
> (f data)
[[1 "chile" [[2 "talca"] [3 "concepcion"] [4 "puerto montt"]]]
[5 "united states" [[6 "boston"] [7 "texas"]]]]
这可能是一种更 "Clojurey" 的方式:
(defn countries->vecs [data]
(let [->pair (juxt :name :id)
map->pairs (fn [{:keys [country subcountries]}]
(apply vector (->pair country)
(map ->pair subcountries)))]
(mapv map->pairs data)))
我一直在尝试将向量中映射的嵌套值映射到向量的向量中,但没有成功。
我的数据是这样的:
[{:country {:name "chile", :id 1},
:subcountries [{:name "talca", :id 2}
{:name "concepcion", :id 3}
{:name "puerto montt", :id 4}]}
{:country {:name "united states", :id 5},
:subcountries [{:name "boston", :id 6}
{:name "texas", :id 7}]}]
虽然我一直在玩的代码含糊不清 returns 我试图得到的结果的近似值:
(map
(fn [x]
(let [{{id :id name :name} :country
subcountries :subcountries} x]
[id
name
(map (fn [y] (let [{yid :id yname :yname} y] [yid yname])))]))
data)
我收到的结果很奇怪,因为我想要的向量只是一个函数:
([1 "chile" #function[clojure.core/map/fn--5862]]
[5 "united states" #function[clojure.core/map/fn--5862]])
我做错了什么?
预期输出应该是这样的:
[[["chile" 1] ["talca" 2] ["concepcion" 3] ["puerto montt" 4]]
[["united states" 5] ["boston" 6] ["texas" 7]]]
您在矢量输出中看到该函数的原因是您的内部 map
没有将该函数应用于任何数据结构,因此它返回了一个转换器。
我在这里更新了内部 map
以将函数映射到子国家/地区,我认为这是您的意图。 (还有一个小错字,你用的是 yname :yname
而不是 yname :name
)
(defn f [data]
(mapv
(fn [x]
(let [{{id :id name :name} :country
subcountries :subcountries} x]
[id
name
(mapv (fn [y] (let [{yid :id yname :name} y] [yid yname])) subcountries)]))
data))
不确定这是否正是您想要的输出,因为您说过 "something like..."。如果没有,请告诉我们您是否需要更多帮助才能完成剩下的工作。
> (f data)
[[1 "chile" [[2 "talca"] [3 "concepcion"] [4 "puerto montt"]]]
[5 "united states" [[6 "boston"] [7 "texas"]]]]
这可能是一种更 "Clojurey" 的方式:
(defn countries->vecs [data]
(let [->pair (juxt :name :id)
map->pairs (fn [{:keys [country subcountries]}]
(apply vector (->pair country)
(map ->pair subcountries)))]
(mapv map->pairs data)))