2016-04-05 119 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])) 
相關問題