web-dev-qa-db-ja.com

Elixirリストまたはタプルにアイテムが存在するかどうかを確認する方法は?

これは一見シンプルですが、ドキュメントで見つけることができないようです。リストまたはタプルにアイテムが存在する場合は、単にtrueまたはfalseを返す必要があります。 Enum.find/3は本当にこれを行う最良の方法ですか?

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

Enum.member?/2 を使用できます

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

タプルでは、​​最初に Tuple.to_list/1 を使用してリストに変換する必要があります。

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

ここと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"

タプルを確認する場合は、リストに変換する必要があります(クレジット@Gazler):

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

しかし、@ CaptChrisDがコメントで指摘したように、通常、パターンマッチングのためにタプル内のアイテムの正確な位置を気にするため、これはタプルの珍しい必要性です。

31
ewH

または、単にinを使用します。

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

昨日、Elixirでプログラミングを開始しましたが、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]))
2
Johel Carvalho

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