计算列表中的键数

时间:2018-01-18 15:52:56

标签: elixir

是否有一种惯用的方法来计算此列表中的密钥test出现的次数?

[%{"test" => 1}, %{"test" => 3}, %{"test2" => 1}]

我会定义一个变量并使用Enum.eachfor ->,但我知道必须有一种方法可以让它更具功能性。

2 个答案:

答案 0 :(得分:3)

您可以使用Enum.count/2Map.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

但不幸的是,它没有:)