更新或合并地图

时间:2018-01-11 11:48:19

标签: elixir

假设我有这张地图

old = %{stuff: %{old: 123}}

如何更新密钥stuff:

我还有其他地图:

new = %{stuff: %{new: 321}}

使用Map.put它会覆盖填充键,我也尝试了Map.merge但它没有合并,它会覆盖第二个地图的键

iex(22)> Map.merge(test, new)
%{stuff: %{new: 321}}

我希望有类似的东西:

%{stuff: %{old: 123, new: 321}}

1 个答案:

答案 0 :(得分:3)

我能想到的两种方式:

  1. 使用update_in

    iex(1)> old = %{stuff: %{old: 123}}
    %{stuff: %{old: 123}}
    iex(2)> update_in(old, [:stuff], &Map.put(&1, :new, 321))
    %{stuff: %{new: 321, old: 123}}
    
  2. 使用Map.merge/3使用Map.merge/2合并这两个值:

    iex(3)> new = %{stuff: %{new: 321}}
    %{stuff: %{new: 321}}
    iex(4)> Map.merge(old, new, fn k, v1, v2 -> Map.merge(v1, v2) end)
    %{stuff: %{new: 321, old: 123}}