Functional programming 如何在Elixir中映射和减少映射列表

Functional programming 如何在Elixir中映射和减少映射列表,functional-programming,elixir,phoenix-framework,Functional Programming,Elixir,Phoenix Framework,映射和减少长生不老药列表并将其转换为新列表的好方法是什么 要求: 1.查找具有相同id的地图: 2.合并“角色”键的值(即收集所有唯一值)。 3.对于所有其他贴图(列表元素),不执行任何操作 list = [%{"id": 1, "role": ["A", "B"]}, %{"id": 2, "role": ["B", "C"]}, %{"id": 1, "role": ["C", "A"]} ] 需要在以下列表中进行转换: ans_list = [%{"id": 1, "role": ["A

映射和减少长生不老药列表并将其转换为新列表的好方法是什么

要求: 1.查找具有相同id的地图: 2.合并“角色”键的值(即收集所有唯一值)。 3.对于所有其他贴图(列表元素),不执行任何操作

list = [%{"id": 1, "role": ["A", "B"]}, %{"id": 2, "role": ["B", "C"]}, %{"id": 1, "role": ["C", "A"]} ]
需要在以下列表中进行转换:

ans_list = [%{"id": 1, "role": ["A", "B", "C"]}, %{"id": 2, "role": ["B", "C"]}]

您可以使用
Enum.group_by/2
id
分组,然后对于每个组,将
角色
传递给
Enum.flat_map/2
Enum.uniq/1

list = [%{"id": 1, "role": ["A", "B"]}, %{"id": 2, "role": ["B", "C"]}, %{"id": 1, "role": ["C", "A"]} ]

list
|> Enum.group_by(&(&1.id))
|> Enum.map(fn {key, value} ->
  %{id: key, role: value |> Enum.flat_map(&(&1.role)) |> Enum.uniq}
end)
|> IO.inspect
输出:

[%{id: 1, role: ["A", "B", "C"]}, %{id: 2, role: ["B", "C"]}]
[%{id: 1, role: ["A", "B", "C"], somekey: "value of the key 1"},
 %{id: 2, role: ["B", "C"], somekey: "value of the key 2"}]

根据下面评论中的要求,以下是如何保留所有键/值对并仅修改组中第一项的
角色

list =  [%{"id": 1, "role": ["A", "B"], "somekey": "value of the key 1"},
         %{"id": 2, "role": ["B", "C"], "somekey": "value of the key 2"},
         %{"id": 1, "role": ["C", "A"], "somekey": "value of the key 3"}]

list
|> Enum.group_by(&(&1.id))
|> Enum.map(fn {_, [value | _] = values} ->
  %{value | role: values |> Enum.flat_map(&(&1.role)) |> Enum.uniq}
end)
|> IO.inspect
输出:

[%{id: 1, role: ["A", "B", "C"]}, %{id: 2, role: ["B", "C"]}]
[%{id: 1, role: ["A", "B", "C"], somekey: "value of the key 1"},
 %{id: 2, role: ["B", "C"], somekey: "value of the key 2"}]

您可以使用
Enum.group_by/2
id
分组,然后对于每个组,将
角色
传递给
Enum.flat_map/2
Enum.uniq/1

list = [%{"id": 1, "role": ["A", "B"]}, %{"id": 2, "role": ["B", "C"]}, %{"id": 1, "role": ["C", "A"]} ]

list
|> Enum.group_by(&(&1.id))
|> Enum.map(fn {key, value} ->
  %{id: key, role: value |> Enum.flat_map(&(&1.role)) |> Enum.uniq}
end)
|> IO.inspect
输出:

[%{id: 1, role: ["A", "B", "C"]}, %{id: 2, role: ["B", "C"]}]
[%{id: 1, role: ["A", "B", "C"], somekey: "value of the key 1"},
 %{id: 2, role: ["B", "C"], somekey: "value of the key 2"}]

根据下面评论中的要求,以下是如何保留所有键/值对并仅修改组中第一项的
角色

list =  [%{"id": 1, "role": ["A", "B"], "somekey": "value of the key 1"},
         %{"id": 2, "role": ["B", "C"], "somekey": "value of the key 2"},
         %{"id": 1, "role": ["C", "A"], "somekey": "value of the key 3"}]

list
|> Enum.group_by(&(&1.id))
|> Enum.map(fn {_, [value | _] = values} ->
  %{value | role: values |> Enum.flat_map(&(&1.role)) |> Enum.uniq}
end)
|> IO.inspect
输出:

[%{id: 1, role: ["A", "B", "C"]}, %{id: 2, role: ["B", "C"]}]
[%{id: 1, role: ["A", "B", "C"], somekey: "value of the key 1"},
 %{id: 2, role: ["B", "C"], somekey: "value of the key 2"}]

当我们有多个键值对时,获得相同结果的好方法是什么!e、 g[%{“id”:1,“role”:[“A”,“B”],“somekey”:“key的值”},%{“id”:2,“role”:[“B”,“C”],“somekey”:“key的值”},%{“id”:1,“role”:[“C”,“A”],“somekey”:“key的值”}]我们不想更改其他键的值。如果两个具有相同
id
的地图的
somekey
的值不同怎么办?观察得很好。我试图让所有的元素都有相同的id,并且需要收缩合并他们所有的uniq角色。但同时,我有几个(实际上是6个)其他键值对,它们不应该被改变。如果两个记录有不同的键值对,那么我们可以只保留值最低的一个,也可以保留第一个映射的键值。我正在查看
Enum.map\u reduce
Enum.reduce
,但正在努力找出解决方案。我添加了一个解决方案以保留第一个映射。如果您想选择映射以继续使用其他一些条件,只需从
值中选择适当的
,并在
%{value |…}
行中使用它。当我们有多个键值对时,有什么好方法可以获得相同的结果呢!e、 g[%{“id”:1,“role”:[“A”,“B”],“somekey”:“key的值”},%{“id”:2,“role”:[“B”,“C”],“somekey”:“key的值”},%{“id”:1,“role”:[“C”,“A”],“somekey”:“key的值”}]我们不想更改其他键的值。如果两个具有相同
id
的地图的
somekey
的值不同怎么办?观察得很好。我试图让所有的元素都有相同的id,并且需要收缩合并他们所有的uniq角色。但同时,我有几个(实际上是6个)其他键值对,它们不应该被改变。如果两个记录有不同的键值对,那么我们可以只保留值最低的一个,也可以保留第一个映射的键值。我正在查看
Enum.map\u reduce
Enum.reduce
,但正在努力找出解决方案。我添加了一个解决方案以保留第一个映射。如果要选择贴图以继续使用其他一些条件,只需从
值中选择适当的
,并在
%{value |…}
行中使用该值。