2016-04-05 123 views
44

这看起来很简单,但我似乎无法在文档中找到它。如果项目存在于列表或元组中,我只需简单地返回truefalseEnum.find/3真的是最好的方法吗?如何检查一个项目是否存在于Elixir列表或元组中?

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

有关列表,我可以看到你只想看,如果该项目是有其Enum.member/2会?做个好人。 但是对于一个元组,你通常关心值的位置,这是元组的美丽之一......如果你不关心位置,可能需要考虑元组的使用 – CaptChrisD

+0

你可能想标记@ Gazler的答案是正确的答案。 –

回答

60

您可以使用Enum.member?/2

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

有了一个元组,你将要转换为首先使用列表Tuple.to_list/1

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

谢谢Gazler。您的回答是正确的,但我想根据我在社区中收到的所有建议发布一个单独的答案。 – ewH

+0

请注意,您将无法在警卫内使用'Enum.member?/ 2'。在那种情况下,你将不得不依靠'in'。例如:'当在[“one”,“two”]中的字符串时,def foo(string),做:IO.puts(string)'。顺便说一下,这很有趣,因为'in'是一个转换为'Enum.member?/ 2'的宏:D – Alessandro

22

基于这里的答案,并在药剂懈怠,有多种方法可以检查项目是否存在于列表中。 每答案由@Gazler:

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

或者干脆

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

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

,或者如果你想找到并返回,而不是truefalse

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

如果你想检查一个元组,你需要转换为列表(信用@Gazler):

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

但作为@CaptChrisD在评论中指出,这是一个元组的罕见的需要,因为人们通常关心项目在元组中的确切位置以进行模式匹配。

8

或者只是使用in

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

您可以使用find_value太

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 
2

我在药剂昨天开始编程,但我会尝试一些我做了很多的JS,也许它是当列表中有很多元素并且您不想一直使用Enum.member来遍历它时有用吗?

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

您也可以检索与其他一些列表的交集:

Enum.filter(some_other_list,&(map_existence[&1])) 
相关问题