Как объединить два списка с картами на основе определенного ключа - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть 2 списка, состоящих из карт.

products =
[
  %{id: 7, name: "A", count: 1},
  %{id: 8, name: "B", count: 1},
  %{id: 9, name: "C", count: 0}
]

price=
[
  %{price: "$14.95", p_id: 8},
  %{price: "$10.00", p_id: 7},
  %{price: "$29.95", p_id: 10},
  %{price: "$1.00", p_id: 9}

]

Я хочу объединить их таким образом, чтобы соответствующий идентификатор из прайс-листа был объединен со списком продуктов так, чтобы окончательный список выглядел как

products=
[
  %{id: 7, name: "A", count: 1, price: "$10.00"},
  %{id: 8, name: "B", count: 1, price: "$14.95"},
  %{id: 9, name: "C", count: 0, price: "$1.00"}
]

Как мы можем этого добиться ??

1 Ответ

1 голос
/ 27 апреля 2020

Способ хранения данных не оптимален. Связанные списки не являются типом термина, который используется для хранения данных, которые должны быть просмотрены. Карта %{id => details} подойдет лучше.

Если вы настаиваете на использовании списков, это все еще выполнимо. Предполагая, что есть цены на все существующие продукты, можно сделать

Enum.map(products, &Map.put(
  &1, :price, Enum.find(price, fn %{p_id: pid} -> pid == &1.id end).price))
#⇒ [
#    %{count: 1, id: 7, name: "A", price: "$10.00"},
#    %{count: 1, id: 8, name: "B", price: "$14.95"},
#    %{count: 0, id: 9, name: "C", price: "$1.00"}
#  ]

Здесь мы в основном отображаем входные данные для себя, расширяя каждую карту тем, что мы искали в прайс-листе. Если цена может отсутствовать, необходимо провести более тщательную обработку обновления.

...