如何根据特定键将两个列表与地图合并
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"}
# ]
这里我们基本上将输入映射到自身,用我们在价格列表中查找的内容扩展每个映射。如果可能没有价格,则必须更谨慎地处理更新。
我有 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"}
# ]
这里我们基本上将输入映射到自身,用我们在价格列表中查找的内容扩展每个映射。如果可能没有价格,则必须更谨慎地处理更新。