如何在不存在的路径上更新嵌套映射

时间:2018-05-04 14:35:15

标签: elixir

有用于更新Elixir,Kernel.put_in / 3和Kernel.update_in / 3中的嵌套数据结构的内核函数,它们有助于使用路径和值或函数更新Elixir的不可变数据结构,在后一种情况下。

这是update_in的文档中的示例:

users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
update_in(users, ["john", :age], &(&1 + 1))
%{"john" => %{age: 28}, "meg" => %{age: 23}}

如何更改以支持在数据结构中的不存在路径上放置值?

如果使用未知的第一个路径元素,则会发生这种情况:

put_in(users, ["clara", :age], 29)
** (ArgumentError) could not put/update key :age on a nil value
    (elixir) lib/access.ex:379: Access.get_and_update/3
    (elixir) lib/map.ex:773: Map.get_and_update/3
    (elixir) lib/kernel.ex:2057: Kernel.put_in/3

期望的结果是:

%{"john" => %{age: 27}, "meg" => %{age: 23}, "clara" => %{age: 29}}

1 个答案:

答案 0 :(得分:3)

如果特定密钥不存在,您可以使用Access.key/2指定默认值。在这种情况下,您需要将密钥"clara"的值默认为%{}

iex(1)> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
iex(2)> put_in(users, [Access.key("clara", %{}), :age], 29)
%{"clara" => %{age: 29}, "john" => %{age: 27}, "meg" => %{age: 23}}