给出这样的地图:
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", ""}]
谢谢!
答案 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
(这是一个字符串因此总是真的)。