列表到 Elixir 中的关键字列表
List to Keyword List in Elixir
我有一个使用 Ecto 提取的结果列表。我想以一个关键字列表结束,然后我可以使用它来填充 Phoenix 内部的 <select>
但我不确定如何将此列表转换为关键字列表,例如 ["1": "Author #1", "2": "Author #2"]
authors = Repo.all(Author)
# How would I create ["1": "Author #1", "2": "Author #2"]
Select 仅作者姓名使用 Enum.map
authorNames = authors |> Enum.map(fn a-> a.name end)
然后使用Enum.zip设置键值对
1..Enum.count(authors ) |> Enum.map(fn x-> to_string(x) end) |> Enum.zip(authorNames)
这将产生如下内容:
[{"1", "Author #1"}, {"2", "Author #2"}]
如果你想让它成为一个真正的关键字列表,你需要第一个元素是一个原子,因为关键字列表只使用原子作为键
1..Enum.count(authors ) |> Enum.map(fn x-> x |> to_string |> String.to_atom end) |> Enum.zip(authorNames)
这将产生
["1": "Author #1", "2": "Author #2"]
但我一直听说要小心管理原子的数量,将大量字符串转换为原子并不是最佳做法。除非您知道您的查询将有多少作者 return,否则在将键值转换为原子时可能需要小心。
关键字列表需要原子作为关键字。好消息是您不需要关键字列表来提供 select
。这里有两种方法:
直接在查询中做:
authors = Repo.all from a in Author, select: {a.name, a.id}
在数据上做:
authors = Repo.all Author
Enum.map(authors, fn a -> {a.name, a.id} end)
第一个的优点是您将只从 table 加载您需要的数据。
我有一个使用 Ecto 提取的结果列表。我想以一个关键字列表结束,然后我可以使用它来填充 Phoenix 内部的 <select>
但我不确定如何将此列表转换为关键字列表,例如 ["1": "Author #1", "2": "Author #2"]
authors = Repo.all(Author)
# How would I create ["1": "Author #1", "2": "Author #2"]
Select 仅作者姓名使用 Enum.map
authorNames = authors |> Enum.map(fn a-> a.name end)
然后使用Enum.zip设置键值对
1..Enum.count(authors ) |> Enum.map(fn x-> to_string(x) end) |> Enum.zip(authorNames)
这将产生如下内容:
[{"1", "Author #1"}, {"2", "Author #2"}]
如果你想让它成为一个真正的关键字列表,你需要第一个元素是一个原子,因为关键字列表只使用原子作为键
1..Enum.count(authors ) |> Enum.map(fn x-> x |> to_string |> String.to_atom end) |> Enum.zip(authorNames)
这将产生
["1": "Author #1", "2": "Author #2"]
但我一直听说要小心管理原子的数量,将大量字符串转换为原子并不是最佳做法。除非您知道您的查询将有多少作者 return,否则在将键值转换为原子时可能需要小心。
关键字列表需要原子作为关键字。好消息是您不需要关键字列表来提供 select
。这里有两种方法:
直接在查询中做:
authors = Repo.all from a in Author, select: {a.name, a.id}
在数据上做:
authors = Repo.all Author Enum.map(authors, fn a -> {a.name, a.id} end)
第一个的优点是您将只从 table 加载您需要的数据。