如何根据特定键将两个列表与地图合并

How to merge two list with maps based on particular key

我有 2 个包含地图的列表。

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

price=
[
  %{price: ".95", p_id: 8},
  %{price: ".00", p_id: 7},
  %{price: ".95", p_id: 10},
  %{price: ".00", p_id: 9}

]

我想以这样一种方式合并它们,即价目表中的匹配 ID 应与产品列表合并,以便最终列表看起来像

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

我们如何才能做到这一点?

您存储数据的方式不是最优的。链接列表不是一种用于存储应该查找的数据的术语。地图 %{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: ".00"},
#    %{count: 1, id: 8, name: "B", price: ".95"},
#    %{count: 0, id: 9, name: "C", price: ".00"}
#  ]

这里我们基本上将输入映射到自身,用我们在价格列表中查找的内容扩展每个映射。如果可能没有价格,则必须更谨慎地处理更新。