作为Elixir的新手,我在理解模式匹配方面遇到了一些问题.
如果我有这样的Elixir数据结构:
list_with_maps = [%{"id" => 1, "name" => "a"}, %{"id" => 2, "name" => "b"}]
从中获取所有id字段的值的最佳方法是什么?
您可以映射列表并使用Enum.map/2返回id
Enum.map(list_with_maps, fn (x) -> x["id"] end) [1, 2]
您可以使用捕获运算符编写相同的函数:
Enum.map(list_with_maps, & &1["id"])
我更喜欢写作& &1["id"]
,&(&1["id"])
但括号是可选的.
获取a键的子集的一种更通用(更简单)的方法Map
是use Map.take/2
,您可以像这样使用:
map = %{"id" => 1, "name" => "a"} Map.take(map, ["id"]) > %{"id" => 1}
如您所见,它需要一个键数组,并仅包含所需键返回一个新映射。
现在,将其应用于列表就像使用地图,然后使用Map.take/2
in mapper函数一样简单。如前所述,您可以使用lambda来执行此操作:
Enum.map(list_with_maps, fn (map) -> Map.take(map, ["id"]) end)
或者您可以使用捕获:
Enum.map(list_with_maps, &(Map.take(&1, ["id"])))
这将创建更多的中间映射,但是对于大多数情况而言,这不会成为问题,因为Elixir在内存重用方面非常聪明,并且实际上不会多次创建这些对象。