我是功能编程的新手,所以我有点挣扎。
我试图通过地图中的密钥在映射集中找到地图,然后替换其他值。我的方法是在映射集内找到地图,然后从映射集中删除地图,替换地图中的值并将其添加回。
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