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