Как проверить, существует ли элемент в списке эликсиров или кортеже?



это, казалось бы, просто, но я не могу найти его в документах. Мне нужно просто вернуться true или false если элемент существует в списке или кортеже. Это Enum.find/3 действительно лучший способ сделать это?



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

5 ответов:

можно использовать Enum.member?/2

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

с кортежем вы хотите, чтобы преобразовать в список сначала с помощью Tuple.to_list/1

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

основываясь на ответах здесь и в Elixir Slack, есть несколько способов проверить, существует ли элемент в списке. За ответ @Gazler:

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

или просто

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

или

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

или если вы хотите найти и вернуть товар вместо true или false

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

если вы хотите проверить кортеж, вам нужно преобразовать в список (credit @Gazler):

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

но как @CaptChrisD указал в комментариях, это необычная потребность в кортеже, потому что обычно заботятся о точном положении элемента в кортеже для сопоставления с образцом.

или просто использовать in:

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

Я начал программировать в Elixir вчера, но я попробую что-то, что я сделал много в JS, может быть, это полезно, когда список имеет много элементов, и вы не хотите, чтобы пересечь его все время, используя перечисление.член?

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

вы также можете получить пересечение с какой-то другой список:

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

можно использовать 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

Comments

    Ничего не найдено.