首页 > 解决方案 > 在 Elixir 中按几个值映射分组

问题描述

所以我有这张地图

    map = [
             %{id: 2, brand: "TUTU", reference: "1234"}, 
             %{id: 2, brand: "TUTU", reference: "4567"}, 
             %{id: 3, brand: "TOTO", reference: "789456"}
    ]

我想按 ID 对它进行分组以获得这样的结果:

    [
        %{
            id: 2,
            brand: "TUTU",
            reference: [
                 "1234",
                 "5845"
              ]
        },
        %{
             id: 3,
             brand: "TOTO",
             reference: [
                  "4587"
             ]
        }
    ]

我试着Enum.group_by像这样使用

map
|> Enum.group_by(fn entry -> entry.brand end)

但结果看起来像这样:

    %{
      "TOTO" => [%{brand: "TOTO", id: 3, reference: "789456"}],
      "TUTU" => [
        %{brand: "TUTU", id: 2, reference: "1234"},
        %{brand: "TUTU", id: 2, reference: "4567"}
      ]
    }

我觉得我很接近解决方案,但我不知道如何将我的信息重新组合到列表中,而不是将键用作索引....

对不起,我不是很清楚,我只是不知道如何描述我的问题

标签: elixir

解决方案


另一种可能性是Enum.reduce/3直接进入所需的结构Kernel.update_in/3

data
|> Enum.reduce(%{}, fn %{id: id, brand: brand, reference: ref}, acc ->  
  update_in(acc, [{id, brand}], fn
    nil -> %{id: id, brand: brand, reference: [ref]}
    refs -> %{refs | reference: [ref | refs.reference]}
  end)
end)
|> Map.values()

推荐阅读