web-dev-qa-db-fra.com

Comment vérifier si un élément existe dans une liste ou un tuple Elixir?

C'est apparemment simple, mais je n'arrive pas à le trouver dans la documentation. Je dois simplement renvoyer true ou false si un élément existe dans une liste ou un tuple. Est Enum.find/3 vraiment le meilleur moyen de le faire?

Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
69
ewH

Vous pouvez utiliser Enum.member?/2

Enum.member?(["foo", "bar"], "foo")
# true

Avec un tuple, vous voudrez d’abord convertir en une liste en utilisant Tuple.to_list/1

Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
101
Gazler

Sur la base des réponses fournies ici et dans Elixir Slack, il existe plusieurs façons de vérifier si un élément existe dans une liste. Par réponse de @Gazler:

Enum.member?(["foo", "bar"], "foo")
# true

ou simplement

"foo" in ["foo", "bar"]
# true

ou

Enum.any?(["foo", "bar"], &(&1 == "foo")
# true

ou si vous souhaitez rechercher et renvoyer l'élément au lieu de true ou false

Enum.find(["foo", "bar"], &(&1 == "foo")
# "foo"

Si vous voulez vérifier un tuple, vous devez convertir en liste (crédit @Gazler):

Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]

Mais comme l'a souligné @CaptChrisD dans les commentaires, il s'agit d'un besoin inhabituel pour un tuple, car on se préoccupe généralement de la position exacte de l'élément dans un tuple pour la correspondance des modèles.

31
ewH

Ou utilisez simplement in:

iex(1)> "foo" in ["foo", "bar"]
true
iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
true
23
slashmili

J'ai commencé à programmer dans Elixir hier, mais je vais essayer quelque chose que j'ai beaucoup fait dans JS. Peut-être que c'est utile lorsque la liste contient beaucoup d'éléments et que vous ne voulez pas la parcourir tout le temps en utilisant Enum.member?

map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true)))
map_existence[item_to_check]

Vous pouvez également récupérer une intersection avec une autre liste:

Enum.filter(some_other_list,&(map_existence[&1]))
2
Johel Carvalho

Vous pouvez utiliser Enum.find_value/3 aussi:

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
1
Sabit Huraira