动态扩展Elixir中的列表

时间:2018-01-03 19:10:56

标签: elixir

我在列表理解中动态创建地图,然后我尝试将每次迭代中生成的地图附加到列表中。

这是一段代码:

 result = []
 temp_map = %{}

 for n <- 1..number do
   temp_map = Map.put_new(temp_map, :title, Enum.at(titles, n))
   temp_map = Map.put_new(temp_map, :content, Enum.at(contents, n))

   result = result ++ [temp_map]
 end

但该代码会返回:

[[%{contents: "cont-2", title: "tit-2"}], [%{contents: "cont-2", title: nil}]]

我的想法是拥有这些列表:

titles = ["title-1", "title-2"]
contents = ["content-1", "content-2"]

生成这样的结构:

[%{title: "title-1", content: "content-1"}, %{title: "title-2", content: "content-2"}]

我只需要动态添加到列表中。

3 个答案:

答案 0 :(得分:2)

你不能在理解(或其他地方)中使用临时变量,因为如果你不习惯,Elixir的不变性会给你带来意想不到的结果。

实施例

items = ["foo", "bar", "baz"]

i = 0

for item <- items do
  i = i + 1
  IO.puts i
end

将输出

1
1
1

解决方案:

我会尝试这样的事情(使用Enum.zip/2):

titles = ["title-1", "title-2"]
contents = ["content-1", "content-2"]

result = 
  Enum.zip(titles, contents)
  |> Enum.map(fn {title, content} -> %{title: title, content: content} end)

example

答案 1 :(得分:1)

您以面向OOP的方式思考,更实用,更正确的方法是将Enum.zip/2Enum.map/2一起使用

titles = ["title-1", "title-2"]
contents = ["content-1", "content-2"]

result = Enum.zip(titles, contents) 
  |> Enum.map(fn {title, content} -> %{title: title, content: content} end)

# result: 
# [%{content: "content-1", title: "title-1"},
#  %{content: "content-2", title: "title-2"}]

答案 2 :(得分:1)

我将在这里使用理解方法来回答:

[12A, 13B, 14C]