У меня возникли проблемы с поиском решения следующей задачи данных:Объединить две сложные структуры
Допустим, у меня есть карта:
(def defaults {
:name "John"
:surname "Doe"
:info {:date-of-birth "01-01-1980"
:registered [{:type "newsletter" :name "breaking news" }]}
})
А потом я прохожу подобную структурированную карту, но я хочу соединить векторы и перезаписать остальные клавиши:
(def new {
:name "Peter"
:info {:date-of-birth "11-01-1986"
:registered [{:type "alert" :name "mobile-alert" }]}
})
и я хочу этот результат:
{:name "Peter"
:surname "Doe"
:info {:date-of-birth "11-01-1986"
:registered [{:type "newsletter" :name "breaking news" }
{:type "alert" :name "mobile-alert" }]}}
Теперь я могу сделать это легко с помощью статического синтаксиса, как:
(reduce conj (get-in defaults [:info :registered]) (get-in new [:info :registered]))
(Существует, вероятно, лучший способ ...) Но я надеялся, что больше динамической функции со следующими свойствами:
- Храните все ключи от обеих карт, не зная структуру
- Обновить любые клавиши со значениями правой карты
- если вал ключа является вектором, то
conj
вектор с вектором правой карты (если соответствующий ключ существует, конечно)
Спасибо за помощь заранее :)
+1 Полностью забыл о 'merge-with'. –
Работает отлично. Я подозревал, что это как-то связано с слиянием, но я не мог понять это ... Приветствия! –