【问题标题】:Add / Remove key-value pairs from a Map从 Map 中添加/删除键值对
【发布时间】:2023-04-01 19:55:02
【问题描述】:

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

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

map[:d] = 4

【问题讨论】:

    标签: elixir


    【解决方案1】:

    添加到地图

    使用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}
    

    【讨论】:

    【解决方案2】:

    您的问题

    不要忘记 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
    

    所以如果你想“改变”你的地图,你需要用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}
    

    【讨论】:

    • @Sheharyar 给出了正确的答案,但我更喜欢这个强调长生不老药不变性的答案,这是一个微妙的概念,我很难理解。像这样的答案总是对我很有启发。
    【解决方案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"}
    

    或者使用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}
    

    【讨论】:

    • “请注意,不推荐将非空列表作为收藏品传递” - hexdocs.pm/elixir/1.12/Enum.html#into/2
    • 这些示例将地图作为收藏品传递,而不是非空列表。
    • 我明白了,感谢您指出不同之处
    猜你喜欢
    • 2021-06-20
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多