我有类似这样的结构列表。
[ %Phonebook{name: "Family", id: 3}, %Phonebook{name: "Friend", id: 2},
%Phonebook{name: "Relatives", id: 1} ]
我想成为这样的人。
["Family": "3", "Friend": "2", "Relatives": "1"]
如何使用Elixir做到这一点?
答案 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})