【发布时间】:2023-04-01 19:55:02
【问题描述】:
如何在 Elixir 映射中添加(和删除)键值对?这不起作用:
map = %{a: 1, b: 2, c: 3}
map[:d] = 4
【问题讨论】:
标签: elixir
如何在 Elixir 映射中添加(和删除)键值对?这不起作用:
map = %{a: 1, b: 2, c: 3}
map[:d] = 4
【问题讨论】:
标签: elixir
map = Map.put(map, :d, 4)
#=> %{a: 1, b: 2, c: 3, d: 4}
map = Map.delete(map, :b)
#=> %{a: 1, c: 3}
【讨论】:
不要忘记 Elixir 中的变量是不可变的。
所以下面的代码没有意义,因为你不能像这样直接改变map或map[:d]的值:
map[:d] = 4
以下是您可以使用的函数:
Map.put(map, key, value) 向地图添加元素
Map.delete(map, key) 从地图中移除元素
由于 Elixir 变量是不可变的,这些函数会返回一个新地图,而不是直接更改您的地图。示例:
iex(1)> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex(2)> Map.put(map, :d, 4)
%{a: 1, b: 2, c: 3, d: 4}
iex(3)> map
%{a: 1, b: 2, c: 3} # map is unchanged
所以如果你想“改变”你的地图,你需要用Map.put()或Map.delete()返回的新地图替换旧的map变量。示例:
iex(1)> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex(2)> map = Map.put(map, :d, 4)
%{a: 1, b: 2, c: 3, d: 4}
iex(3)> map = Map.delete(map, :a)
%{b: 2, c: 3, d: 4}
【讨论】:
如果你有一个Enumerable 的键值对,你可以使用Map.new/1 来创建一个新的映射:
iex> values = [a: 1, b: 2, c: 3]
[a: 1, b: 2, c: 3]
iex> Map.new(values)
%{a: 1, b: 2, c: 3}
要添加到现有地图,地图实现Collectable 协议,因此您可以使用Enum.into/2:
iex> map = %{existing: "value"}
%{existing: "value"}
iex> Enum.into(values, map)
%{a: 1, b: 2, c: 3, existing: "value"}
或者使用comprehension:
iex> for {k, v} <- values, into: map, do: {k, v}
%{a: 1, b: 2, c: 3, existing: "value"}
对于一次删除多个键,有Map.drop/2:
iex> map = %{a: 1, b: 2, c: 3, d: 4, e: 5}
%{a: 1, b: 2, c: 3, d: 4, e: 5}
iex> Map.drop(map, [:a, :c])
%{b: 2, d: 4, e: 5}
【讨论】: