Как проверить, существует ли элемент в списке эликсиров или кортеже?
это, казалось бы, просто, но я не могу найти его в документах. Мне нужно просто вернуться true или false если элемент существует в списке или кортеже. Это Enum.find/3 действительно лучший способ сделать это?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
5 ответов:
можно использовать
Enum.member?/2Enum.member?(["foo", "bar"], "foo") # trueс кортежем вы хотите, чтобы преобразовать в список сначала с помощью
Tuple.to_list/1Tuple.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илиfalseEnum.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