是否有一种惯用的方法来计算此列表中的密钥test
出现的次数?
[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}]
我会定义一个变量并使用Enum.each
或for ->
,但我知道必须有一种方法可以让它更具功能性。
答案 0 :(得分:3)
您可以使用Enum.count/2
和Map.has_key?/2
:
iex(1)> list = [%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}]
[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}]
iex(2)> Enum.count(list, &Map.has_key?(&1, "test"))
2
根据下面的评论中的要求,以下是如何计算列表列表:
iex(3)> lists = [list, list, list]
[[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}],
[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}],
[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}]]
iex(4)> lists |> Enum.reduce(0, fn list, acc -> acc + Enum.count(list, &Map.has_key?(&1, "test")) end)
6
答案 1 :(得分:2)
出于好奇,使用Kernel.SpecialForms.for/1
理解的异国情调回答:
String.length(
for %{"test" => _} <- [%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}],
do: <<"+">>, into: ""
)
当我们有一个列表列表时,最好扩展到这种情况:
String.length(
for list <- lists, %{"test" => _} <- list, do: <<"+">>, into: ""
)
如果为Integer
实施Collectable
协议,则可以更简洁的方式编写:
for %{"test" => _} <- [%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}],
do: 1, into: 0
但不幸的是,它没有:)