从映射中添加/删除键值对

问题描述 投票:0回答:3

如何在 Elixir 映射中添加(和删除)键值对?这不起作用:

map = %{a: 1, b: 2, c: 3}

map[:d] = 4
elixir
3个回答
76
投票

添加到地图

使用

Map.put(map, key, value)

map = Map.put(map, :d, 4)
#=> %{a: 1, b: 2, c: 3, d: 4}

从地图中删除

使用

Map.delete(map, key)

map = Map.delete(map, :b)
#=> %{a: 1, c: 3}

39
投票

不要忘记变量在 Elixir 中是不可变的

所以下面的代码没有意义,因为你不能像这样直接改变

map
map[:d]
的值:

map[:d] = 4

解决方案

以下是您可以使用的功能:

如何使用这些功能?

由于 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
Map.put()
返回的新地图替换旧的
Map.delete()
变量。示例:

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}

3
投票

插入多个键值对

如果您有

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"}

或者使用 理解:

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}
© www.soinside.com 2019 - 2024. All rights reserved.