【问题标题】:List to Keyword List in Elixir在 Elixir 中列出关键字列表
【发布时间】:2015-09-17 06:02:54
【问题描述】:

我有一个使用 Ecto 提取的结果列表。我想最终得到一个关键字列表,然后我可以使用它来填充 Phoenix 内部的 <select>,但我不确定如何将此列表变成像 ["1": "Author #1", "2": "Author #2"] 这样的关键字列表

authors = Repo.all(Author)
# How would I create ["1": "Author #1", "2": "Author #2"]

【问题讨论】:

    标签: erlang elixir phoenix-framework


    【解决方案1】:

    关键字列表需要原子作为关键字。好消息是您不需要提供给select 的关键字列表。这里有两种方法:

    1. 直接在查询中做:

      authors = Repo.all from a in Author, select: {a.name, a.id}
      
    2. 在数据上做:

      authors = Repo.all Author
      Enum.map(authors, fn a -> {a.name, a.id} end)
      

    第一个的优点是您将只从表中加载您需要的数据。

    【讨论】:

      【解决方案2】:

      使用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"]
      

      但我一直听说要谨慎管理您拥有的原子数量,并且将大量字符串转换为原子并不是最佳做法。除非您知道查询将返回多少作者,否则在将键号转换为原子时可能需要小心。

      【讨论】:

      • ["1": "Author #1", "2": "Author #2"] 是一个关键字列表。 :"1" 是一个原子。在 iex 中尝试 ["1": "Author #1", "2": "Author #2"] == [{:"1", "Author #1"}, {:"2", "Author #2"}]
      • 而不是使用 Enum.map 来获取名称,您可以只获取带有 ecto 的名称:Repo.all(from(a in Author, select: a.name))
      • @EricMeadows-Jönsson 谢谢,我不是 100% 确定 ["1": "Author #1", "2": "Author #2"] 是什么,但它仍然是一个关键字列表是有道理的。我已经更新了我的答案以反映这一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2020-05-18
      • 2019-02-13
      相关资源
      最近更新 更多