如何在Elixir地图中添加(和删除)键值对?这不起作用:
map = %{a: 1, b: 2, c: 3}
map[:d] = 4
答案 0 :(得分:38)
Map.put(map, :d, 4)
#=> %{a: 1, b: 2, c: 3, d: 4}
Map.delete(map, :b)
#=> %{a: 1, c: 3}
答案 1 :(得分:16)
不要忘记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
或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}
答案 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"}