深层合并图与枚举

  • 本文关键字:枚举 合并 elixir
  • 更新时间 :
  • 英文 :


我有此功能:

defmodule TestQuery do
  def build_query() do
    Enum.map(["test1", "test2", "hello"], fn item ->
      query(item)
    end)
  end
  def query(item) do
    case item do
      "test1" -> %{"test1" => 1}
      "test2" -> %{"test2" => 2}
      "hello" -> %{"hello" => 3}
    end
  end
end

和build_query返回这样的地图列表:

iex(2)> TestQuery.build_query
[%{"test1" => 1}, %{"test2" => 2}, %{"hello" => 3}]

但是有办法只返回这样的单个地图吗?

%{"test1" => 1, "test2" => 2, "hello" => 3}

我应该使用其他方法代替枚举吗?

我知道我可以在列表map.reduce和map.merge列表之后,但我想知道它是否可以在一个步骤中实现。

如果query/1始终返回一对键/值,则可以使用into: %{}使用for并从query/1返回元组:

defmodule TestQuery do
  def build_query do
    for item <- ["test1", "test2", "hello"], into: %{}, do: query(item)
  end
  def query(item) do
    case item do
      "test1" -> {"test1", 1}
      "test2" -> {"test2", 2}
      "hello" -> {"hello", 3}
    end
  end
end
IO.inspect TestQuery.build_query()

输出:

%{"hello" => 3, "test1" => 1, "test2" => 2}

如果它可以返回多个项目,则可以将"简化步骤"合并与地图,并以此为单位:

defmodule TestQuery do
  def build_query do
    Enum.reduce(["test1", "test2", "hello"], %{}, fn item, acc ->
      Map.merge(acc, query(item))
    end)
  end
  def query(item) do
    case item do
      "test1" -> %{"test1" => 1}
      "test2" -> %{"test2" => 2}
      "hello" -> %{"hello" => 3}
    end
  end
end
IO.inspect TestQuery.build_query()

输出与上述相同。

最新更新