Слияние карт эликсира - PullRequest
       20

Слияние карт эликсира

2 голосов
/ 24 апреля 2019

как мне объединить эти 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}]}

Простой Map.merge(foo,bar) не делает этого вКстати, значение c - это список.

Заранее спасибо!Christoph

1 Ответ

3 голосов
/ 24 апреля 2019

Использование 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}]}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...