¿Cómo verificar si un elemento existe en una lista o tupla de Elixir?
(5)
Esto es aparentemente simple, pero parece que no puedo encontrarlo en los documentos.
Simplemente necesito devolver
true
o
false
si existe un elemento en una lista o tupla.
¿Es
Enum.find/3
realmente la mejor manera de hacer esto?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
Empecé a programar en Elixir ayer, pero intentaré algo que hice mucho en JS, ¿tal vez sea útil cuando la lista tiene muchos elementos y no quieres recorrerla todo el tiempo usando Enum.member?
map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true)))
map_existence[item_to_check]
También puede recuperar una intersección con alguna otra lista:
Enum.filter(some_other_list,&(map_existence[&1]))
O simplemente usar
in
:
iex(1)> "foo" in ["foo", "bar"]
true
iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
true
Puedes usar
Enum.member?/2
Enum.member?(["foo", "bar"], "foo")
# true
Con una tupla, primero querrá convertir a una lista usando
Tuple.to_list/1
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
Según las respuestas aquí y en Elixir Slack, hay varias formas de verificar si un elemento existe en una lista. Por respuesta de @Gazler:
Enum.member?(["foo", "bar"], "foo")
# true
o simplemente
"foo" in ["foo", "bar"]
# true
o
Enum.any?(["foo", "bar"], &(&1 == "foo")
# true
o si desea encontrar y devolver el artículo en lugar de
true
o
false
Enum.find(["foo", "bar"], &(&1 == "foo")
# "foo"
Si desea verificar una tupla, debe convertirla a la lista (crédito @Gazler):
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
Pero como @CaptChrisD señaló en los comentarios, esta es una necesidad poco común de una tupla porque a uno generalmente le importa la posición exacta del elemento en una tupla para la coincidencia de patrones.
También puede usar
Enum.find_value/3
:
iex(1)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="foo" end)
true
iex(2)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="food" end)
false