在Enum.each复杂条件下返回项目

时间:2018-01-16 16:34:05

标签: elixir

我有这个集合

collection = [%{"id" => 1, "items" => ["test1", "test2"]},
              %{"id" => 2, "items" => ["test3", "test4"]}]

如何让商品"test3"获取地图%{"id" => 2, "items" => ["test3", "test4"]}]

怎么可以做功能风格?如果找不到,请返回nil

Enum.each(collection, fn(element) ->
  if Enum.member?(element["items"], "test3") do
    # return the value?
  end
end)

2 个答案:

答案 0 :(得分:3)

您可以使用Enum.find/2

Enum.find(collection, fn x -> "test3" in x["items"] end)
iex(1)> collection = [%{"id" => 1, "items" => ["test1", "test2"]},
...(1)>               %{"id" => 2, "items" => ["test3", "test4"]}]
iex(2)> Enum.find(collection, fn x -> "test3" in x["items"] end)
%{"id" => 2, "items" => ["test3", "test4"]}
iex(3)> Enum.find(collection, fn x -> "test5" in x["items"] end)
nil

答案 1 :(得分:0)

虽然Enum.find/3是实现目标的完全合法的方式,但[可以说]更惯用的方法是使用普通的旧理解:

for %{"items" => items} = elem <- collection,
    "test3" in items, do: elem
#⇒ [%{"id" => 2, "items" => ["test3", "test4"]}]

以上返回列表,可能是e。 G。用管道传送到List.first/1以检索第一个找到的元素。一般来说,从列表中获取第一个匹配元素的想法甚至不能保证被排序对我来说听起来很危险。