【问题标题】:How to change all the values in an Elixir map如何更改 Elixir 地图中的所有值
【发布时间】:2014-12-24 05:34:46
【问题描述】:

我看到在 Dict 模块中有一个 update,但是更改所有值的 update_all 方法呢?

我尝试使用 Enum.map 执行此操作,但类型发生了变化:

iex(6)> Enum.map(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
[a: 3]

【问题讨论】:

    标签: functional-programming elixir


    【解决方案1】:

    这里有一个想法:

    def update_map map, [head|tail], func do
        update_map(
            Dict.update(map, head, :unknown, func),
            tail,
            func
        )
    end
    
    
    def update_map map, [], _ do
        map
    end
    

    然后调用它:

    iex(1)> d = %{:a => 1, :b => 2, :c => 3}
    %{a: 1, b: 2, c: 3}
    iex(2)> update_map(d, Dict.keys(d), fn v -> v + 1 end)
    %{a: 2, b: 3, c: 4}
    

    【讨论】:

      【解决方案2】:

      您可以通过管道传递给Enum.into(%{}) 或使用for 理解,即:

      iex> for {k, v} <- %{a: 1, b: 2}, into: %{}, do: {k, v + 1}
      %{a: 2, b: 3}
      

      【讨论】:

        【解决方案3】:

        你也可以这样做:

        iex> Map.new(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
        %{:a => 3}
        

        但感觉标准库中应该有一些东西可以让这更容易(Map.??(%{:a =&gt; 2}, &amp;(&amp;1 + 1)))。

        【讨论】:

          【解决方案4】:

          让我添加Enum.into 到组合中

          headers
          |> Enum.group_by(fn {k, _v} -> k end, fn {_k, v} -> v end)
          |> Enum.into(%{}, fn {k, v} -> {k, Enum.join(v, ", ")} end)
          

          这样转:

          [{"cookie", "a"}, {"cookie", "b"}] into %{"cookie", "a, b"}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-23
            • 1970-01-01
            • 2015-03-19
            相关资源
            最近更新 更多