【问题标题】:How to map and reduce List of Maps in Elixir如何在 Elixir 中映射和减少映射列表
【发布时间】:2023-04-03 18:35:02
【问题描述】:

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

要求: 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"]}]

【问题讨论】:

    标签: functional-programming elixir phoenix-framework


    【解决方案1】:

    您可以使用Enum.group_by/2id 分组,然后对于每个组,将role 传递给Enum.flat_map/2Enum.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"]}]
    

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

    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"], somekey: "value of the key 1"},
     %{id: 2, role: ["B", "C"], somekey: "value of the key 2"}]
    

    【讨论】:

    • 当我们有多个键值对时,什么是获得相同结果的好方法!例如 [%{"id": 1, "role": ["A", "B"], "somekey": "key 的值"}, %{"id": 2, "role": [" B", "C"], "somekey": "key 的值"}, %{"id": 1, "role": ["C", "A"], "somekey": "key 的值key"} ] 而且我们不想改变其他键的值。
    • 如果somekey的值对于两个具有相同id的映射不同怎么办?
    • 很棒的观察。我正在尝试获取所有具有相同 id 并且需要缩小其所有 uniq 角色的元素。但与此同时,我几乎没有(实际上是 6 个)其他键值对,它们不应该被改变。如果两条记录具有不同的键值对,那么我们可以只保留具有最低值的那个,或者我们可以保留第一个映射的键值。我正在查看Enum.map_reduceEnum.reduce,但正在努力找出解决方案。
    • 我添加了一个解决方案来保留第一张地图。如果您想选择地图以继续使用其他标准,只需从values 中选择适当的value 并在%{value | ...} 行中使用它。
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多