如何使用特定的键值对替换 MapSet Map 中的值?



我是功能编程的新手,所以我有点挣扎。

我试图通过地图中的密钥在映射集中找到地图,然后替换其他值。我的方法是在映射集内找到地图,然后从映射集中删除地图,替换地图中的值并将其添加回。

def replace_in_mapset_by_id(mapset, id, key, value) do
    # Find the Map that matches the ID of the Map we are looking for
    foundMap = (Enum.find(mapset, fn(x) -> Map.get(x, "ID") == id end))
    # Remove the found Map from the MapSet
    remove(mapset, foundMap)
    # Replace the Key Value that we are trying update
    updatedMap = Map.replace(foundMap, key, value)
    add(mapset, updatedMap)
end

另一种[我相信更多的惯用方法是使用带有变压器MapSet.new/2的工厂:

iex|1 ▶ map = MapSet.new([%{id: 1, key: :foo}, %{id: 2, key: :bar}])
#MapSet<[%{id: 1, key: :foo}, %{id: 2, key: :bar}]>
iex|2 ▶ MapSet.new(map, fn                 
...|2 ▶   %{id: 1} = old -> %{old | key: :baz}
...|2 ▶   any -> any
...|2 ▶ end)
#MapSet<[%{id: 1, key: :baz}, %{id: 2, key: :bar}]>

在您的功能中使用:

def replace_in_mapset_by_id(mapset, id, key, value) do
  MapSet.new(mapset, fn                 
    %{id: ^id} = old -> %{old | key => value} # update only
    # %{id: ^id} = old -> Map.put(old, key, value) # update/insert
    any -> any
  end)
end

最新更新