Объединение карт эликсира

#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}]}
  

Вы не указали правило для объединения чего-либо, кроме списков, но вышеупомянутое может быть легко расширено для обработки чего угодно. Теперь он понимает списки, карты, равные значения и неравные значения.