如何更改Elixir地图中的所有值

时间:2014-10-28 17:27:15

标签: functional-programming elixir

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

我尝试使用Enum.map执行此操作,但类型已更改:

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

4 个答案:

答案 0 :(得分:25)

你可以输入Enum.into(%{})或使用for理解,即:

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

答案 1 :(得分:2)

您也可以这样做:

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

但是,感觉标准库中应该有一些东西使它变得更容易(Map.??(%{:a => 2}, &(&1 + 1)))。

答案 2 :(得分:0)

这是一个想法:

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}

答案 3 :(得分:0)

让我把 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"}