Карта вложенного вектора карт массивов - PullRequest
1 голос
/ 23 февраля 2020

Я безуспешно пытался отобразить вложенные значения карты в векторе в вектор векторов.

У меня есть такие данные:

[{: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}]}]

Хотя код, с которым я играю, смутно возвращает приблизительное значение того, что я пытаюсь получить в результате:

(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]]]

Ответы [ 2 ]

4 голосов
/ 23 февраля 2020

Причина, по которой вы видите функцию в векторном выводе, заключается в том, что ваш внутренний 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))

Не уверен, что это именно то, что вам нужно, так как вы сказали "что-то вроде ...". Если нет, дайте нам знать, если вам нужна дополнительная помощь, чтобы получить его до конца.

> (f data)
[[1 "chile" [[2 "talca"] [3 "concepcion"] [4 "puerto montt"]]]
 [5 "united states" [[6 "boston"] [7 "texas"]]]]
3 голосов
/ 24 февраля 2020

Это может быть более "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)))
...