gpt4 book ai didi

Elixir map - 分组依据和排序字段

转载 作者:行者123 更新时间:2023-12-01 00:11:13 25 4
gpt4 key购买 nike

在 Elixir 中我有这张 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" }]

我想把它转换成下面的输出

输出:

[%{ 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)

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

最佳答案

您可以使用 Enum.group_by 的第三个参数来提取 gamer_idgamer_name 然后使用 做一些处理枚举.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"
}
]

关于Elixir map - 分组依据和排序字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51304444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com