Лучший способ преобразования вложенной структуры данных clojure - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть карта замыкания, которая выглядит так:

{"l1" [{"name" "s1", "url" "something", "coordinates" {"latitude" 100, "longitude" 200}}
       {"name" "s2", "url" "something", "coordinates" {"latitude" 150, "longitude" 77.08472222222221}}]}

и я хочу преобразовать String ключи в keyword ключи. Это вывод, который я хочу:

{"l1" ({:name "s1", :url "something", :coordinates {:latitude 100, :longitude 200}}
       {:name "s2", :url "something", :coordinates {:latitude 150, :longitude 77.08472222222221}})}

Это код, который я использовал для этой задачи:

(->> _tt
     (map (fn [[k v]]
            [k (map (fn [entry]
                      (->> entry
                           (map (fn [[k v]]
                                  [(keyword k) (if (= k "coordinates")
                                                 (->> v
                                                      (map (fn [[k v]]
                                                             [(keyword k) v]))
                                                      (into {}))
                                                 v)]))
                           (into {})))
                    v)]))
     (into {}))

Есть ли лучший способ сделать это? (возможно с участием молнии?)

Решение:

(->> _tt
     (map (fn [[k v]]
            [k (clojure.walk/keywordize-keys v)]))
     (into {})))

1 Ответ

2 голосов
/ 30 апреля 2019
(let [a {"l1" [{"name" "s1", "url" "something", "coordinates" {"latitude" 100, "longitude" 200}}
               {"name" "s2", "url" "something", "coordinates" {"latitude" 150, "longitude" 77.08472222222221}}]}
      ]
    (clojure.walk/keywordize-keys a))
=>
{:l1 [{:name "s1", :url "something", :coordinates {:latitude 100, :longitude 200}}
      {:name "s2", :url "something", :coordinates {:latitude 150, :longitude 77.08472222222221}}]}
...