从Map添加/删除键值对

时间:2016-10-25 23:23:14

标签: elixir

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

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

map[:d] = 4

3 个答案:

答案 0 :(得分:38)

添加到地图

使用Map.put(map, key, value)

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

从地图中删除

使用Map.delete(map, key)

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

答案 1 :(得分:16)

您的问题

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

所以下面的代码没有意义,因为你不能像这样直接改变mapmap[: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

因此,如果您想“更改”地图,则需要使用mapMap.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}

答案 2 :(得分:1)

插入多个键值对

如果您有 Enumerable 个键值对,您可以使用 Map.new/1 创建一个新映射:

+--------+--------------------------------------+------+-----------+
| id     | name                                 | year | rankscore |
+--------+--------------------------------------+------+-----------+
| 282455 | Roundhay Garden Scene                | 1888 |      NULL |
| 337409 | Traffic Crossing Leeds Bridge        | 1888 |      NULL |
| 218187 | Monkeyshines, No. 2                  | 1890 |      NULL |
| 218186 | Monkeyshines, No. 1                  | 1890 |       7.3 |
| 218188 | Monkeyshines, No. 3                  | 1890 |      NULL |
|  95175 | Duncan Smoking                       | 1891 |       3.6 |
| 230974 | Newark Athlete                       | 1891 |       4.3 |
|  95174 | Duncan or Devonald with Muslin Cloud | 1891 |       3.5 |
| 218116 | Monkey and Another, Boxing           | 1891 |       3.2 |
|  95171 | Duncan and Another, Blacksmith Shop  | 1891 |       3.5 |
+--------+--------------------------------------+------+-----------+

要添加到现有地图,地图实现了 Collectable 协议,因此您可以使用 Enum.into/2

iex> values = [a: 1, b: 2, c: 3]
[a: 1, b: 2, c: 3]
iex> Map.new(values)
%{a: 1, b: 2, c: 3}

或者使用 comprehension:

iex> map = %{existing: "value"}
%{existing: "value"}
iex> Enum.into(values, map)
%{a: 1, b: 2, c: 3, existing: "value"}

删除多个键

一次删除多个键,有Map.drop/2

iex> for {k, v} <- values, into: map, do: {k, v}
%{a: 1, b: 2, c: 3, existing: "value"}