可能不是“最复杂的方法”,但我认为一个不错的方法是模式匹配,使用带有子句的匿名函数来匹配您想要更改的内容,以及其他所有内容:
iex> l = [
...> %{
...> code: "test",
...> expired_at: ~U[2020-10-27 17:49:47Z],
...> },
...> %{
...> code: "test",
...> expired_at: ~U[2021-07-30 13:54:11Z],
...> }
...> ]
[
%{code: "test", expired_at: ~U[2020-10-27 17:49:47Z]},
%{code: "test", expired_at: ~U[2021-07-30 13:54:11Z]}
]
iex> Enum.map(l, &Map.new(&1, fn
...> {:code, code} -> {:product_code, code}
...> pair -> pair
...> end))
[
%{expired_at: ~U[2020-10-27 17:49:47Z], product_code: "test"},
%{expired_at: ~U[2021-07-30 13:54:11Z], product_code: "test"}
]
注意Map.new/2 的使用,它从给定的可枚举中创建一个映射,其中包含将给定函数应用于可枚举的元素
或者可能更清楚的替代方法,不使用 Map.new/2 这样或迭代地图的键,可以使用 Map.delete/2 和 Map.put/3:
iex> Enum.map(l, fn %{code: code} = element ->
...> element
...> |> Map.delete(:code)
...> |> Map.put(:product_code, code)
...> end)
[
%{expired_at: ~U[2020-10-27 17:49:47Z], product_code: "test"},
%{expired_at: ~U[2021-07-30 13:54:11Z], product_code: "test"}
]