映射数组映射的嵌套向量

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)))