我在列表理解中动态创建地图,然后我尝试将每次迭代中生成的地图附加到列表中。
这是一段代码:
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"}]
我只需要动态添加到列表中。
答案 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)
答案 1 :(得分:1)
您以面向OOP的方式思考,更实用,更正确的方法是将Enum.zip/2
与Enum.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]