首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Elixir:如何将关键字列表转换为映射?

Elixir:如何将关键字列表转换为映射?
EN

Stack Overflow用户
提问于 2015-07-22 05:02:39
回答 3查看 17.7K关注 0票数 39

我有一个关键字的Ecto变更集错误列表,我希望将其转换为映射,这样Poison JSON解析器就可以正确地输出JSON格式的验证错误列表。

我得到的错误列表如下:

代码语言:javascript
复制
[:topic_id, "can't be blank", :created_by, "can't be blank"]

...and我想得到一个错误地图,如下所示:

代码语言:javascript
复制
%{topic_id: "can't be blank", created_by: "can't be blank"}

或者,如果我可以将它转换为字符串列表,我也可以使用它。

完成这两项任务的最佳方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-22 05:51:53

你所拥有的不是一个关键字列表,它只是一个列表,每个奇数元素代表一个键,每个偶数元素代表一个值。

区别在于:

代码语言:javascript
复制
[:topic_id, "can't be blank", :created_by, "can't be blank"] # List
[topic_id: "can't be blank", created_by: "can't be blank"]   # Keyword List

可以使用Enum.into/2将关键字列表转换为地图

代码语言:javascript
复制
Enum.into([topic_id: "can't be blank", created_by: "can't be blank"], %{})

由于您的数据结构是列表,因此可以使用Enum.chunk_every/2Enum.reduce/3对其进行转换

代码语言:javascript
复制
[:topic_id, "can't be blank", :created_by, "can't be blank"]
|> Enum.chunk_every(2)
|> Enum.reduce(%{}, fn ([key, val], acc) -> Map.put(acc, key, val) end)

您可以在http://elixir-lang.org/getting-started/maps-and-dicts.html上阅读有关关键字列表的更多信息

票数 62
EN

Stack Overflow用户

发布于 2015-07-22 09:20:05

另一种方法是将Enum.chunk/2Enum.into/3结合使用。例如:

代码语言:javascript
复制
[:topic_id, "can't be blank", :created_by, "can't be blank"]
|> Enum.chunk(2)
|> Enum.into(%{}, fn [key, val] -> {key, val} end)
票数 11
EN

Stack Overflow用户

发布于 2015-07-23 20:10:22

另一种方法是使用列表理解:

代码语言:javascript
复制
iex> list = [:topic_id, "can't be blank", :created_by, "can't be blank"]
iex> map = for [key, val] <- Enum.chunk(list, 2), into: %{}, do: {key, val}
%{created_by: "can't be blank", topic_id: "can't be blank"}

此外,您还可以将您的列表转换为关键字列表:

代码语言:javascript
复制
iex> klist = for [key, val] <- Enum.chunk(list, 2), do: {key, val}
[topic_id: "can't be blank", created_by: "can't be blank"]

在某些情况下,它也可能很有用。

您可以在http://elixir-lang.org/getting-started/comprehensions.html#results-other-than-lists上阅读有关此用例的更多信息

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31549555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档