如何遍历Elixir中的地图列表?

时间:2017-12-29 16:45:37

标签: elixir

我无法理解如何在Elixir中使用索引进行迭代。

例如,我有来自java的这个片段,我想把它翻译成Elixir:

for(int i = 1; i < list.size(); i++) {
   list.order = i;
}

让我们说list是来自Elixir的地图列表。 我无法理解如何以Elixir方式执行此操作或仅使用某个索引变量进行迭代。

3 个答案:

答案 0 :(得分:3)

使用不允许数据突变的语言时,它不像迭代集合和设置值那么简单。相反,您需要使用包含字段集的新对象创建新集合。

在Elixir中,您可以使用.transitionDuration(0)

执行此操作
foldl

答案 1 :(得分:2)

虽然Justin的答案完全有效,但惯用的Elixir解决方案是使用Enum.with_index/2

list = ~w|a b c d e|
list
|> Enum.with_index()
|> Enum.each(fn {e, idx} -> IO.puts "Elem: #{e}, Idx: #{idx}" end)

#⇒ Elem: a, Idx: 0
#⇒ Elem: b, Idx: 1
#⇒ Elem: c, Idx: 2
#⇒ Elem: d, Idx: 3
#⇒ Elem: e, Idx: 4

答案 2 :(得分:0)

或者使用for理解

[debug] localized_titles %{attributes: [%{"en" => "The English Title of a Playlist"}, %{"fr" => "Le French Title of a Playlist"}]}

      maps =
        for title <- localized_titles,
            _ = Logger.debug("title #{inspect(%{attributes: title})}"),
            {k, v} <- title do
          IO.puts "#{k} --> #{v}"

          Repo.insert(%PlaylistTitle{language_id: k, localizedname: v, uuid: Ecto.UUID.generate(), playlist_id: playlist.id})
        end
      Logger.debug("maps #{inspect(%{attributes: maps})}")
      {:ok, maps}