尝试使用 Enum.reduce
Trying to use Enum.reduce
正在尝试转换以下模板
[
%{ids: ["A123"], name: "Red"},
%{ids: ["A123"], name: "Blue"},
%{ids: ["B123"], name: "Blue"}
]
至
[
%{ids: ["A123"], name: "Red"},
%{ids: ["A123", "B123"], name: "Blue"},
]
如果键名相同,则合并一个列表中的id。例如:名称 blue 有两个 id 并合并到一个列表中。任何人都可以使用 Enum.reduce
帮助我实现这一目标
data = [
%{ids: ["A123"], name: "Red"},
%{ids: ["A123"], name: "Blue"},
%{ids: ["B123"], name: "Blue"}
]
使用Enum.group_by/3
and List.flatten/1
:
data
|> Enum.group_by(&(&1.name), &(&1.ids))
|> Enum.map(fn {color, ids} -> %{name: color, ids: List.flatten(ids)} end)
使用Enum.reduce/3
and Map.update/4
:
data
|> Enum.reduce(%{}, fn %{ids: ids, name: name}, acc ->
Map.update(acc, name, ids, fn prev_ids -> prev_ids ++ ids end)
end)
|> Enum.map(fn {color, ids} -> %{name: color, ids: ids} end)
如您所见,使用 group_by
稍微不那么冗长,而且可能更清晰。这两种方法都使用中间映射来简化分组。
正在尝试转换以下模板
[
%{ids: ["A123"], name: "Red"},
%{ids: ["A123"], name: "Blue"},
%{ids: ["B123"], name: "Blue"}
]
至
[
%{ids: ["A123"], name: "Red"},
%{ids: ["A123", "B123"], name: "Blue"},
]
如果键名相同,则合并一个列表中的id。例如:名称 blue 有两个 id 并合并到一个列表中。任何人都可以使用 Enum.reduce
帮助我实现这一目标data = [
%{ids: ["A123"], name: "Red"},
%{ids: ["A123"], name: "Blue"},
%{ids: ["B123"], name: "Blue"}
]
使用Enum.group_by/3
and List.flatten/1
:
data
|> Enum.group_by(&(&1.name), &(&1.ids))
|> Enum.map(fn {color, ids} -> %{name: color, ids: List.flatten(ids)} end)
使用Enum.reduce/3
and Map.update/4
:
data
|> Enum.reduce(%{}, fn %{ids: ids, name: name}, acc ->
Map.update(acc, name, ids, fn prev_ids -> prev_ids ++ ids end)
end)
|> Enum.map(fn {color, ids} -> %{name: color, ids: ids} end)
如您所见,使用 group_by
稍微不那么冗长,而且可能更清晰。这两种方法都使用中间映射来简化分组。