Elixir 在两个列表中找到第一个匹配元素
Elixir find first matching element in two lists
我是 Elixir 的新手,我遇到了一个小生意问题。我正在尝试将 api 调用中返回的数据本地化到我的 Phoenix 中间层。我正在获取用户的浏览器语言并将其解析到列表中。语言的顺序是相关的。我想从我支持的语言列表中的浏览器语言列表中找到第一个匹配的语言。
我可以用嵌套循环来做这一切,但这似乎是 Elixir 可以做得更优雅的事情。
使用Enum.find/3
:
user = ~w|ge es it|
supported = ~w|it ru en|
Enum.find(user, 'en', fn l -> Enum.empty?([l] -- supported) end)
此处 'en'
是要 return 编辑的默认语言,因为没有找到匹配项。如果没有匹配项,[l] -- supported
(列表干扰)将 return [l]
,如果 supported
.
中存在 l
,则 []
或者,也可以使用嵌套 Enum.find/3
]:
Enum.find(user, 'en', fn l -> Enum.find(supported, & &1 == l) end)
将您支持的语言转换成一个集合:
supported_langs = ["a", "b", "c"]
user_langs = ["z", "s", "b", "a"]
supported_langs_set = supported_langs |> Enum.into(MapSet.new)
Enum.find(user_langs, fn user_lang ->
MapSet.member? supported_langs_set, user_lang
end)
在集合中查找某物比一遍又一遍地遍历 supported_langs 列表查找每个 user_lang 更快。但是,如果您的列表只有几个元素那么长,那不会有太大区别。
我是 Elixir 的新手,我遇到了一个小生意问题。我正在尝试将 api 调用中返回的数据本地化到我的 Phoenix 中间层。我正在获取用户的浏览器语言并将其解析到列表中。语言的顺序是相关的。我想从我支持的语言列表中的浏览器语言列表中找到第一个匹配的语言。
我可以用嵌套循环来做这一切,但这似乎是 Elixir 可以做得更优雅的事情。
使用Enum.find/3
:
user = ~w|ge es it|
supported = ~w|it ru en|
Enum.find(user, 'en', fn l -> Enum.empty?([l] -- supported) end)
此处 'en'
是要 return 编辑的默认语言,因为没有找到匹配项。如果没有匹配项,[l] -- supported
(列表干扰)将 return [l]
,如果 supported
.
l
,则 []
或者,也可以使用嵌套 Enum.find/3
]:
Enum.find(user, 'en', fn l -> Enum.find(supported, & &1 == l) end)
将您支持的语言转换成一个集合:
supported_langs = ["a", "b", "c"]
user_langs = ["z", "s", "b", "a"]
supported_langs_set = supported_langs |> Enum.into(MapSet.new)
Enum.find(user_langs, fn user_lang ->
MapSet.member? supported_langs_set, user_lang
end)
在集合中查找某物比一遍又一遍地遍历 supported_langs 列表查找每个 user_lang 更快。但是,如果您的列表只有几个元素那么长,那不会有太大区别。