Elixir在地图中获取非空的值

时间:2017-06-16 02:00:41

标签: dictionary enums elixir

给出这样的地图:

mapOne = %{"dog" => "foo", "cat" => "", "name" => "generic","fizz" => "", }

如何只获取列表中空的值的键? ["cat", "fizz"]

似乎Enum.filter返回的是键值对的列表,而不仅仅是列表

mapOne |> Enum.filter(fn {k,v} -> if v == "" do k end end) [{"cat", ""}, {"fizz", ""}]

谢谢!

3 个答案:

答案 0 :(得分:6)

理解在这种情况下运作良好:

iex(1)> mapOne = %{"dog" => "foo", "cat" => "", "name" => "generic","fizz" => "", }

iex(2)> for {k, v} <- mapOne, v == "", do: k

["cat", "fizz"]

答案 1 :(得分:1)

Enum.reduce(mapOne, [], fn
  ({k, ""}, acc) -> [k | acc]
  ({k, _v}, acc) -> acc
end)

这会返回一个与前一个答案相反的顺序列表,但是地图的键顺序无论如何都没有意义。

答案 2 :(得分:0)

mapOne = %{"dog" => "foo", "cat" => "", "name" => "generic","fizz" => "", }

mapOne
|> Enum.filter(fn{_k, v}-> v == "" end)
|> Enum.map(fn{k, _v}-> k end)

顺便说一下,Enum.filter/2使原始列表/地图中的项目使匿名函数返回 truthy值(即不是{{1}而不是false)。

您的匿名功能

nil
fn {k,v} -> if v == "" do k end end 不为空时,

返回nil(这是假的),v为空时,k(这是一个字符串因此总是真的)。​​