我看到Dict模块中有一个update
,但是update_all
方法改变了所有值呢?
我尝试使用Enum.map
执行此操作,但类型已更改:
iex(6)> Enum.map(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
[a: 3]
答案 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"}