Elixir - Map单独替换特定键值

sdg*_*sdg 3 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}]}
]
Run Code Online (Sandbox Code Playgroud)

在这张地图中,我想要替换所有的值m_value并且n_value单独使用.

我想将所有乘以m_value2和所有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}]}
]
Run Code Online (Sandbox Code Playgroud)

你对如何实现这个有什么建议吗?

Ale*_*kin 6

一个无法替代的药剂中的一切东西(有一些非常罕见的限制,比如进程字典,但是这绝对是超出范围在这里.)

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}]}]
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于`users`中只有一个元素.对于列表实现,需要另一个嵌套for. (2认同)