Преобразуйте карту M в массив карт A, где ключи и значения из M отображаются на новые ключи в элементах A

Для такой карты:

{
 "keystring1" "valuestring1"
 "keystring2" "valuestring2"
 ...
}

Как я могу преобразовать его в массив таких карт:

[
 {
  :newKey1 "keystring1"
  :newKey2 "valuestring1"
 }
 {
  :newKey1 "keystring2"
  :newKey2 "valuestring2"
 }
 ...
]

Из моих исследований я предполагаю, что функции reduce-kv и assoc должны быть полезны здесь, но пока я не смог создать рабочую версию.

Закрытие, которое я получил до сих пор:

 (reduce-kv (fn [m k v]
   (merge m (assoc {} :newkey1 k) (assoc {} :newkey2 v)))
   []
   {"keystring1" "valuestring1", "keystring2" "valuestring2"})

Результат:

[{:newkey1 "keystring1"} {:newkey2 "valuestring1"} {:newkey1 "keystring2"} {:newkey2 "valuestring2"}]
1

7 ответы

Мне нравится использовать для для таких вещей.

(def m {"keystring1" "valuestring1"
        "keystring2" "valuestring2"})

> (for [[k v] m]
    {:newkey1 k
     :newkey2 v})

({:newkey1 "keystring1", :newkey2 "valuestring1"}
 {:newkey1 "keystring2", :newkey2 "valuestring2"})

Вы можете заставить его быть вектором, если это действительно необходимо:

> (vec (for [[k v] m]
         {:newkey1 k
          :newkey2 v}))

[{:newkey1 "keystring1", :newkey2 "valuestring1"}
 {:newkey1 "keystring2", :newkey2 "valuestring2"}]
3
добавлено

Мне нравится использовать для для таких вещей.

(def m {"keystring1" "valuestring1"
        "keystring2" "valuestring2"})

> (for [[k v] m]
    {:newkey1 k
     :newkey2 v})

({:newkey1 "keystring1", :newkey2 "valuestring1"}
 {:newkey1 "keystring2", :newkey2 "valuestring2"})

Вы можете заставить его быть вектором, если это действительно необходимо:

> (vec (for [[k v] m]
         {:newkey1 k
          :newkey2 v}))

[{:newkey1 "keystring1", :newkey2 "valuestring1"}
 {:newkey1 "keystring2", :newkey2 "valuestring2"}]
3
добавлено

Вот решение, использующее reduce-kv :

(def my-map
  {"keystring1" "valuestring1"
   "keystring2" "valuestring2"})

(reduce-kv
  (fn [acc k v] (conj acc {:newKey1 k :newKey2 v}))
  []
  my-map)

Или используя zipmap :

(mapv #(zipmap [:newKey1 :newKey2] %) my-map)

Оба производят это:

=> [{:newKey1 "keystring1", :newKey2 "valuestring1"}
    {:newKey1 "keystring2", :newKey2 "valuestring2"}]
2
добавлено
Спасибо, решение с использованием mapv и zipmap действительно аккуратно!
добавлено автор Jdv, источник
FWIW Я бы пошел с подходом для . Я просто добавил их как альтернативы.
добавлено автор Taylor Wood, источник

Вот решение, использующее reduce-kv :

(def my-map
  {"keystring1" "valuestring1"
   "keystring2" "valuestring2"})

(reduce-kv
  (fn [acc k v] (conj acc {:newKey1 k :newKey2 v}))
  []
  my-map)

Или используя zipmap :

(mapv #(zipmap [:newKey1 :newKey2] %) my-map)

Оба производят это:

=> [{:newKey1 "keystring1", :newKey2 "valuestring1"}
    {:newKey1 "keystring2", :newKey2 "valuestring2"}]
2
добавлено
Спасибо, решение с использованием mapv и zipmap действительно аккуратно!
добавлено автор Jdv, источник
FWIW Я бы пошел с подходом для . Я просто добавил их как альтернативы.
добавлено автор Taylor Wood, источник

Вот решение, использующее reduce-kv :

(def my-map
  {"keystring1" "valuestring1"
   "keystring2" "valuestring2"})

(reduce-kv
  (fn [acc k v] (conj acc {:newKey1 k :newKey2 v}))
  []
  my-map)

Или используя zipmap :

(mapv #(zipmap [:newKey1 :newKey2] %) my-map)

Оба производят это:

=> [{:newKey1 "keystring1", :newKey2 "valuestring1"}
    {:newKey1 "keystring2", :newKey2 "valuestring2"}]
2
добавлено
Спасибо, решение с использованием mapv и zipmap действительно аккуратно!
добавлено автор Jdv, источник
FWIW Я бы пошел с подходом для . Я просто добавил их как альтернативы.
добавлено автор Taylor Wood, источник

и еще один, для полноты:

user> (map (partial zipmap [:new-key1 :new-key2]) data)

;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})

или

user> (map zipmap (repeat [:new-key1 :new-key2]) data)

;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})
1
добавлено

и еще один, для полноты:

user> (map (partial zipmap [:new-key1 :new-key2]) data)

;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})

или

user> (map zipmap (repeat [:new-key1 :new-key2]) data)

;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})
1
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Clojure — русскоговорящее сообщество
Clojure — русскоговорящее сообщество
433 участник(ов)

Общаемся на темы, посвященный Clojure. Решаем проблемы, обмениваемся опытом и делимся новостями. Вакансии и поиск работы: @clojure_jobs Вам могут быть интересны: @javascript_ru, @nodejs_ru, @ruby_ru, @devops_ru, @devops_jobs