我在列表理解中动态地创建地图,然后尝试在每次迭代中将生成的映射附加到列表中。
这是一个代码:
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"}]我只需要添加一些动态列表。
发布于 2018-01-03 19:30:24
您不能在这样的理解(或其他地方)中使用临时变量,因为如果您不习惯,那么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)

发布于 2018-01-03 19:28:12
以面向对象的方式思考,一种更实用、更正确的方法是将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"}]发布于 2018-01-04 06:34:45
我将用理解的方法给出答案:
for {t, c} <- Enum.zip(titles, contents),
do: %{title: t, content: c}
#⇒ [
# %{content: "content-1", title: "title-1"},
# %{content: "content-2", title: "title-2"}
# ]https://stackoverflow.com/questions/48083691
复制相似问题