我有一个Elixir地图列表,我想在其中替换一些值
map = [
%{id: 1, users: [%{m_value: 2, n_value: 2}]},
%{id: 2, users: [%{m_value: 4, n_value: 5}]},
%{id: 3, users: [%{m_value: 3, n_value: 4}]}
]
在此地图中,我想单独替换m_value
和n_value
的所有值。
我想将所有m_value
乘以2,并将所有n_value乘以3
所以我的最终输出将是:
map = [
%{id: 1, users: [%{m_value: 4, n_value: 6}]},
%{id: 2, users: [%{m_value: 8, n_value: 15}]},
%{id: 3, users: [%{m_value: 6, n_value: 12}]}
]
您对此有何建议?
答案 0 :(得分:5)
一个不能替换 Elixir中所有内容的任何内容(有一些非常罕见的限制,例如进程字典,但这绝对不在这里。)
Elixir中的一切是不可变的。任何看起来像“更新”地图的代码,都会简单地生成新地图。
对Kernel.SpecialForms.for/1
的理解可能会得到帮助:
for %{users: [%{m_value: mv, n_value: nv}]} = m <- map,
do: %{ m | users: [%{m_value: mv * 2, n_value: nv * 3}]}
#⇒ [
# %{id: 1, users: [%{m_value: 4, n_value: 6}]},
# %{id: 2, users: [%{m_value: 8, n_value: 15}]},
# %{id: 3, users: [%{m_value: 6, n_value: 12}]}]
答案 1 :(得分:4)
我假设您的有效map
如下:
map = [
%{id: 1, users: [%{m_value: 2, n_value: 2}]},
%{id: 2, users: [%{m_value: 4, n_value: 5}]},
%{id: 3, users: [%{m_value: 6, n_value: 12}]}
]
请注意,这是地图列表
然后,您可以在遍历列表中的元素时尝试使用update_in
:
Enum.map(
map,
fn el ->
el
|> update_in([:users, Access.all(), :m_value], fn val -> val * 2 end)
|> update_in([:users, Access.all(), :n_value], fn val -> val * 3 end)
end
)
希望有帮助!