Elixir在两个列表中找到第一个匹配元素

时间:2018-08-17 14:25:12

标签: elixir phoenix-framework

我对Elixir相当陌生,并且有一个小企业问题。我正在尝试对通过API调用返回给Phoenix Phoenix中间层的数据进行本地化。我正在获取用户的浏览器语言并将其解析为列表。语言的顺序是相关的。我想从支持的语言列表中的浏览器语言列表中找到第一个匹配的语言。

我可以使用嵌套循环和所有这些来做到这一点,但是似乎Elixir可以做得更优雅。

2 个答案:

答案 0 :(得分:2)

使用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'是要返回的默认语言,因为未找到匹配的语言。如果[l] -- supported中不存在匹配项,则[l](列表分散注意力)将返回[],如果l中存在supported,则返回Enum.find/3

或者,也可以使用嵌套的Enum.find(user, 'en', fn l -> Enum.find(supported, & &1 == l) end) ]:

$this

答案 1 :(得分:0)

将您支持的语言转换为一组:

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)

快速查找集合中的某些内容v。遍历遍历遍历supported_langs列表以查找每个user_lang。但是,如果您的列表只有几个元素,那么不会有太大的不同。