Functional programming 如何在Elixir中映射和减少映射列表
映射和减少长生不老药列表并将其转换为新列表的好方法是什么 要求: 1.查找具有相同id的地图: 2.合并“角色”键的值(即收集所有唯一值)。 3.对于所有其他贴图(列表元素),不执行任何操作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
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 |…}
行中使用该值。