首页 > 解决方案 > Elixir Map - 分组和排序字段

问题描述

在 Elixir 我有这张地图

   my_map =  [%{ user_id: 1, user_name: "David", gamer_id: 100, gamer_name: "John"  },
    %{ user_id: 1, user_name: "David", gamer_id: 101, gamer_name: "Bil"  },
    %{ user_id: 1, user_name: "David", gamer_id: 103, gamer_name: "Ruk"  },
    %{ user_id: 2, user_name: "Ron", gamer_id: 104, gamer_name: "Sam"  },
    %{ user_id: 2, user_name: "Ron", gamer_id: 105, gamer_name: "Sean"  }]

我想将其转换为以下输出

输出 :

[%{ user_id: 1, username: "David", 
    games: [
        %{
            gamer_id: 100,
            gamer_name: "John"
        },
        %{
            gamer_id: 101,
            gamer_name: "Bil"
        },
        %{
            gamer_id: 103,
            gamer_name: "Ruk"
        }
    ]
},
%{ user_id: 2, username: "Ron", 
    games: [
        %{
            gamer_id: 104,
            gamer_name: "Sam"
        },
        %{
            gamer_id: 105,
            gamer_name: "Sean"
        }
    ]
}]

我尝试了 Enum.group_by ,但都无法实现

my_map |> Enum.group_by(fn(x) -> x.user_id end)

任何有关如何实现这一目标的见解将不胜感激。

标签: elixir

解决方案


您可以使用的第三个参数Enum.group_by来提取gamer_idgamer_name然后使用以下方法进行一些处理Enum.map

my_map =  [%{user_id: 1, user_name: "David", gamer_id: 100, gamer_name: "John"},
           %{user_id: 1, user_name: "David", gamer_id: 101, gamer_name: "Bil"},
           %{user_id: 1, user_name: "David", gamer_id: 103, gamer_name: "Ruk"},
           %{user_id: 2, user_name: "Ron", gamer_id: 104, gamer_name: "Sam"},
           %{user_id: 2, user_name: "Ron", gamer_id: 105, gamer_name: "Sean"}]

my_map
|> Enum.group_by(&Map.take(&1, [:user_id, :user_name]), &Map.take(&1, [:gamer_id, :gamer_name]))
|> Enum.map(fn {k, v} -> Map.put(k, :games, v) end)
|> IO.inspect

输出:

[
  %{
    games: [
      %{gamer_id: 100, gamer_name: "John"},
      %{gamer_id: 101, gamer_name: "Bil"},
      %{gamer_id: 103, gamer_name: "Ruk"}
    ],
    user_id: 1,
    user_name: "David"
  },
  %{
    games: [
      %{gamer_id: 104, gamer_name: "Sam"},
      %{gamer_id: 105, gamer_name: "Sean"}
    ],
    user_id: 2,
    user_name: "Ron"
  }
]

推荐阅读