【问题标题】:Elixir: rename key in dictionaryElixir:重命名字典中的键
【发布时间】:2020-07-31 17:14:31
【问题描述】:

我有以下地图列表:

[
  %{
    code: "test",
    expired_at: ~U[2020-10-27 17:49:47Z],
  },
  %{
    code: "test",
    expired_at: ~U[2021-07-30 13:54:11Z],
  }
]

将列表中所有地图实体的键 code 重命名为 product_code 的最复杂方法是​​什么?

【问题讨论】:

    标签: dictionary elixir key rename


    【解决方案1】:

    可能不是“最复杂的方法”,但我认为一个不错的方法是模式匹配,使用带有子句的匿名函数来匹配您想要更改的内容,以及其他所有内容:

    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/2Map.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"}
    ]
    

    【讨论】:

      【解决方案2】:

      虽然@sbacarob 的答案完全正确,但如果要更新的主题嵌套很深,它可能很快就会变得嘈杂。

      在这种情况下, 提供了一个很棒的、被极度低估的机制来更新嵌套结构,称为Access。对于这种特殊情况,我们可能会使用 Kernel.update_in/3Access.all/0 来获取列表的所有元素。

      update_in(
        list,
        [Access.all()],
        &(with {v, m} <- Map.pop(&1, :code),
          do: Map.put(m, :product_code, v))
      )
      #⇒ [
      #    %{expired_at: ~U[2020-10-27 17:49:47Z], product_code: "test"},
      #    %{expired_at: ~U[2021-07-30 13:54:11Z], product_code: "test"}
      #  ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-04
        • 2016-09-23
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 2020-11-12
        • 2021-10-08
        相关资源
        最近更新 更多