Elixir-地图仅替换特定键值

时间:2018-07-17 11:57:14

标签: elixir

我有一个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_valuen_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}]}
]

您对此有何建议?

2 个答案:

答案 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
)

希望有帮助!