在Elixir中更新嵌套映射

时间:2017-05-01 09:04:40

标签: elixir

我有一个2级嵌套的地图,如何更新第二级的每个值?现在我正在这样做:

  items = Enum.map(items, fn(a) ->
    a.items2 = Enum.map(a.items2, fn(a2) ->
      Map.put(x2, :some_key, 123) 
    end)

    a
  end)

错误:

cannot invoke remote function "a.items2/0" inside match.

我基本上知道这意味着什么,但是如何修复呢?

请注意,a.items2本身也可能有嵌套地图。

2 个答案:

答案 0 :(得分:1)

您也可以在外面使用Map.put

items = Enum.map(items, fn(a) ->
  Map.put(a, :items2, Enum.map(a.items2, fn(a2) ->
    Map.put(x2, :some_key, 123) 
  end)
end)

或地图更新语法:

items = Enum.map(items, fn(a) ->
  %{a |
    items2: Enum.map(a.items2, fn(a2) ->
      Map.put(x2, :some_key, 123) 
    end)}
end)

答案 1 :(得分:1)

Enum.map(items, fn({k,v}) ->
  {k, put_in(v, [:items2, :some_key], 123)}    
end)