【问题标题】:Updating a nested map in Elixir在 Elixir 中更新嵌套地图
【发布时间】:2018-09-13 03:55:41
【问题描述】:

我有一个 2 级嵌套地图,如何更新 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 本身也可能有一个嵌套映射。

【问题讨论】:

  • 查看update_input_in 函数,它们可能会有所帮助。

标签: elixir


【解决方案1】:
Enum.map(items, fn({k,v}) ->
  {k, put_in(v, [:items2, :some_key], 123)}    
end)

【讨论】:

    【解决方案2】:

    你也可以在外面使用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)
    

    【讨论】:

    • 还有Map.update!、地图更新语法(%{a | items2: Enum.map(...)})、put_inupdate_in,可能还有更多。
    • 如果您有一个嵌套结构,其中所有节点都是地图,除了叶节点是地图集而不是地图,如何做类似的事情? Put_in 似乎没有扩展到 MapSets?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多