通过Elixir中的多个值进行地图分组

Dar*_*uin 0 elixir

所以我有这张地图

    map = [
             %{id: 2, brand: "TUTU", reference: "1234"}, 
             %{id: 2, brand: "TUTU", reference: "4567"}, 
             %{id: 3, brand: "TOTO", reference: "789456"}
    ]
Run Code Online (Sandbox Code Playgroud)

我想按ID将其分组以获得类似以下内容:

    [
        %{
            id: 2,
            brand: "TUTU",
            reference: [
                 "1234",
                 "5845"
              ]
        },
        %{
             id: 3,
             brand: "TOTO",
             reference: [
                  "4587"
             ]
        }
    ]
Run Code Online (Sandbox Code Playgroud)

我试图用Enum.group_by这样

map
|> Enum.group_by(fn entry -> entry.brand end)
Run Code Online (Sandbox Code Playgroud)

但是结果看起来像这样:

    %{
      "TOTO" => [%{brand: "TOTO", id: 3, reference: "789456"}],
      "TUTU" => [
        %{brand: "TUTU", id: 2, reference: "1234"},
        %{brand: "TUTU", id: 2, reference: "4567"}
      ]
    }
Run Code Online (Sandbox Code Playgroud)

我觉得我已经接近解决方案了,但是我不知道如何将信息重新分组到列表中,而不是将键用作索引。

对不起,我不太清楚,我只是不知道该如何形容我的问题

Ale*_*kin 6

另一种可能性是使用以下命令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()
Run Code Online (Sandbox Code Playgroud)