使用get_and_update Elixir修改并返回地图列表

Cyz*_*far 1 elixir

所以我的目标是获取一张地图列表,例如:

[%{"ts" => 1365111111, "url" => "http://example1.com"}, %{"ts" => 1365111115, "url" => "http://example2.com"}]
Run Code Online (Sandbox Code Playgroud)

ts使用DateTime模块转换键的unix时间戳值, 并返回一个新的映射集合:

[%{"ts" => #DateTime<2013-04-04 21:31:51Z>, "url" => "http://example1.com"},%{"ts" => #DateTime<2013-04-04 21:31:51Z>, "url" => "http://example2.com"}]
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用get_and_update/3这样的:

merge_maps =  [%{"ts" => 1365111111, "url" => "http://example1.com"}, %{"ts" => 1365111115, "url" => "http://example2.com"}]

new_maps = Enum.map(merge_maps, fn elem ->
  Map.get_and_update!(elem, "ts", fn curr_value ->
    {curr_value, curr_value |> DateTime.from_unix!} end)
end)
Run Code Online (Sandbox Code Playgroud)

如何返回修改后的映射列表,new_maps而不是返回当前返回的元组列表:

[       
  {1365111111,
   %{"ts" => #DateTime<2013-04-04 21:31:51Z>, "url" => "http://mandrill.com"}},
  {1365111111, %{"ts" => #DateTime<2013-04-04 21:31:51Z>}}
]
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 6

你需要的是Map.update!/3,而不是Map.get_and_update/3:

new_maps = Enum.map(merge_maps, fn elem ->
  Map.update!(elem, "ts", fn curr_value -> curr_value |> DateTime.from_unix! end)
end)
Run Code Online (Sandbox Code Playgroud)

要不就

new_maps = Enum.map(merge_maps, fn elem ->
  Map.update!(elem, "ts", &DateTime.from_unix!/1)
end)
Run Code Online (Sandbox Code Playgroud)

  • 是的,它返回函数返回的第一个值的元组,并使用函数返回的第二个值更新映射。 (2认同)