#maps #elixir
#Карты #elixir
Вопрос:
как я могу объединить эти 2 карты эликсира:
foo = %{a: 1, b: 2, c: [%{d: 3, e: 4}, %{d: 5, e: 6}]}
bar = %{a: 1, b: 2, c: [%{d: 7, e: 8}, %{d: 9, e: 0}]}
… чтобы получить следующий результат:
%{a: 1, b: 2, c: [%{d: 3, e: 4}, %{d: 5, e: 6}, %{d: 7, e: 8}, %{d: 9, e: 0}]}
Simple Map.merge(foo,bar)
не делает этого таким образом, поскольку значение c является списком.
Заранее благодарю вас! Кристоф
Ответ №1:
Использовать Map.merge/3
:
Map.merge(foo, bar, fn
_k, v1, v2 when is_list(v1) and is_list(v2) -> v1 v2 # lists
_k, %{} = v1, %{} = v2 -> Map.merge(v1, v2) # maps
_k, v1, v1 -> v1 # equals
_k, v1, v2 -> {v1, v2} # non-equals
end)
#⇒ %{a: 1, b: 2,
# c: [%{d: 3, e: 4}, %{d: 5, e: 6}, %{d: 7, e: 8}, %{d: 9, e: 0}]}
Вы не указали правило для объединения чего-либо, кроме списков, но вышеупомянутое может быть легко расширено для обработки чего угодно. Теперь он понимает списки, карты, равные значения и неравные значения.