如何从Struct中获取一些价值并将其放入Elixir中的新列表中

时间:2018-08-14 03:58:53

标签: elixir

我有类似这样的结构列表。

[ %Phonebook{name: "Family", id: 3},  %Phonebook{name: "Friend", id: 2},
  %Phonebook{name: "Relatives", id: 1} ]

我想成为这样的人。

["Family": "3", "Friend": "2", "Relatives": "1"]

如何使用Elixir做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,在Elixir中不可能有一个带有字符串键的How to load videos from assets folder? (to play them with VideoView)

在不失一般性的前提下,我们可以假设您有地图,而不是结构。因此,您可以使用Keyword理解力:

list = [
  %{name: "Family", id: 3},
  %{name: "Friend", id: 2},
  %{name: "Relatives", id: 1}
]

for %{name: name, id: id} <- list, do: {name, id}

请注意,您得到的正是您所要求的。

#⇒ [{"Family", 3}, {"Friend", 2}, {"Relatives", 1}]

如果这些是原子,则会以您期望的形式获得关键字:

for %{name: name, id: id} <- list, do: {String.to_atom(name), id}
#⇒ [Family: 3, Friend: 2, Relatives: 1]

是否要退回map,请在上述调用中使用into自变量:

for %{name: name, id: id} <- list, do: {name, id}, into: %{}
#⇒ %{"Family" => 3, "Friend" => 2, "Relatives" => 1}

边注:

[{:Family, 3}, {:Friend, 2}, {:Relatives, 1}] ==
  [Family: 3, Friend: 2, Relatives: 1]
#⇒ true

此外,可以使用Kernel.SpecialForms.for/1方法来实现相同的功能,例如Enum

Enum.map(list, fn item -> {item.name, item.id} end)

或简称:

Enum.map(list, & {&1.name, &1.id})