使用Elixir在地图列表中获取特定键值?

Juk*_*nen 14 elixir

作为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"])但括号是可选的.


Zam*_*ith 6

获取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在内存重用方面非常聪明,并且实际上不会多次创建这些对象。