[英]Elixir Get Map containing maximum values of specific field
我是Elixir编程语言的初学者。
我有一个类似这样的对象:
{
id: uuid,
created_at: DateTime.t,
updated_at: DateTime.t,
type: my_type
}
假设my_type
是my_type
~w[ABCD]
我想编写一个函数,其中包含这些对象的列表并返回以下映射:
%{
A: 120,
B: 220,
C: 560,
D: 0,
any: 560
}
此处的值必须是每个my_type
+ any
其他updated_at
和created_at
列之间的最大差异( Timex.diff(updated_at, created_at, :seconds)
)。 在any
情况下,均不考虑my_type
并在列表中的所有对象中使用my_type
的最大值。
在Elixir中做这件事的最好方法是什么? 谢谢。
下面将按列表的类型对列表进行分组,然后计算每个组的最大差异,最后生成一个映射,其中包含每种类型作为键,最大差异作为值。
map = list
|> Enum.group_by(& &1.type)
|> Enum.map(fn {type, values} ->
max =
values
|> Enum.map(fn %{created_at: created_at, updated_at: updated_at} ->
# return the difference here
end)
|> Enum.max
{type, max}
end)
|> Map.new
这应该给你类似的东西:
%{
A: 120,
B: 220,
C: 560,
D: 0
}
您现在可以通过执行map |> Map.values |> Enum.max
来计算any
值。
我将其张贴在此处是为了格式化和多样化。 @Dogbert的答案可能更合适,尽管这种方法可能更直接,更灵活。
list = [%{type: :a, v1: 10, v2: 20},
%{type: :a, v1: 10, v2: 30},
%{type: :b, v1: 10, v2: 20},
%{type: :c, v1: 10, v2: 20}]
kw = for %{type: t, v1: v1, v2: v2} <- list,
do: {t, v2 - v1}, into: []
#⇒ [a: 10, a: 20, b: 10, c: 10]
kw
|> Enum.sort_by(fn {_, v} -> v end, &>=/2)
|> Enum.uniq_by(fn {k, _} -> k end)
#⇒ [a: 20, b: 10, c: 10]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.