Functional programming Elixir获取包含特定字段最大值的映射
我是长生不老药编程语言的初学者 我有一个类似这样的物体:Functional programming Elixir获取包含特定字段最大值的映射,functional-programming,elixir,Functional Programming,Elixir,我是长生不老药编程语言的初学者 我有一个类似这样的物体: { id: uuid, created_at: DateTime.t, updated_at: DateTime.t, type: my_type } 比如说,myu类型是~w[abcd] 我想编写一个函数,它获取这些对象的列表并返回以下映射: %{ A: 120, B: 220, C: 560, D: 0, any: 560 } 这里的值必须是每个我的类型+的在列(Timex.diff(更新时,
{
id: uuid,
created_at: DateTime.t,
updated_at: DateTime.t,
type: my_type
}
比如说,myu类型
是~w[abcd]
我想编写一个函数,它获取这些对象的列表并返回以下映射:
%{
A: 120,
B: 220,
C: 560,
D: 0,
any: 560
}
这里的值必须是每个我的类型
+的在
列(Timex.diff(更新时,创建时,:秒)
)上更新时和创建时的最大差值。
在any
的情况下,不考虑myu类型
,并在列表中的所有对象中取最大值
用长生不老药最好的方法是什么?谢谢。以下内容将按列表类型对列表进行分组,然后计算每个组的最大差异,最后生成一个包含每个类型作为键、最大差异作为值的映射
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
的值。下面将按列表的类型对列表进行分组,然后计算每个组的最大差异,最后生成一个包含每个类型作为键、最大差异作为值的映射
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}Enum.sort_by(fn{uu,v}->v end,&>=/2)
|>Enum.uniq_by(fn{k,{}->k end)
#⇒[a:20,b:10,c:10]
为了格式和多样性,我在这里发布这篇文章。@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}Enum.sort_by(fn{uu,v}->v end,&>=/2)
|>Enum.uniq_by(fn{k,{}->k end)
#⇒[a:20,b:10,c:10]
如果您在此处键入准确的示例输入和预期输出,这样回答者就可以尝试他们的解决方案,这会很有帮助。具体有什么不清楚?我没有输入确切的例子,因为需要提供日期时间和计算差异。我想我可以避免这种情况。如果你在这里输入一个准确的示例输入和预期输出,这样回答者就可以尝试他们的解决方案,这将是很有帮助的。到底什么是不清楚的?我没有输入确切的例子,因为需要提供日期时间和计算差异。我以为我可以避免这个?另外,除了使用group\u by
之外,还有一个空间可以使用Keyword
的功能为同一个键提供多个值,并且像for%{type:t,v1:v1,v2:v2}Enum.max\u by/3
返回列表的原始元素,而不是映射值,因此需要再次计算差异。我看不出into:[]
在这里有什么用。我们需要每种类型的最大值。除非你的意思是在这个之后为运行组,这应该是有效的。我发布了一个解决方案,它使用理解,而不是为了多样性而使用的答案。?另外,除了使用group\u by
之外,还有一个空间可以使用Keyword
的功能为同一个键提供多个值,并且像for%{type:t,v1:v1,v2:v2}Enum.max\u by/3
返回列表的原始元素,而不是映射值,因此需要再次计算差异。我看不出into:[]
在这里有什么用。我们需要每种类型的最大值。除非你的意思是在这个之后运行小组,这应该是可行的。我已经发布了一个解决方案,它使用理解,而不是为了多样性而作为答案。