所以我的目标是获取一张地图列表,例如:
[%{"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)
你需要的是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)
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |