0

我有一个 JSON 数组:

response = [
  %{
    "created_at" => 1542757526,
    "email" => "bcs@yahoo.com",
    "first_name" => "rana",
    "id" => "YW1pcnBheWFyeUB5YWhvby5jb20=",
    "last_clicked" => nil,
    "last_emailed" => nil,
    "last_name" => "amir",
    "last_opened" => nil,
    "updated_at" => 1542759123
  },
  %{
    "created_at" => 1542757457,
    "email" => "abc@gmail.com",
    "first_name" => "rana",
    "id" => "cmFtaXIyNDI2QGdtYWlsLmNvbQ==",
    "last_clicked" => nil,
    "last_emailed" => nil,
    "last_name" => "amir",
    "last_opened" => nil,
    "updated_at" => 1542759001
  },
  # .......
]

我正在尝试获取变量email中所有项目的字段。response例子:

["bcs@yahoo.com", "xyz@gmail.com", ....]
4

2 回答 2

2

你正在寻找Enum.map/2. 此方法在给定列表/可枚举中的每个项目上调用传递的函数:

Enum.map(response, fn item -> item["email"] end )

或者,您可以使用简写并使其简洁:

Enum.map(response, &(&1["email"]))

外部资源:请参阅thisthis以了解一般函数式编程中映射的概念。

旁注: flat_map/2是一种变体map/2,期望“映射结果”是另一个列表(因此它可以与其余映射结果连接和展平)。

于 2018-11-26T20:29:23.827 回答
0

除了 map ,您还可以查看comprehensions。本质上,它们结合了Enum.map/2Enum.filter/2的功能。

它们允许您执行以下操作:

for %{"email" => email} <- response, do: email

或这个:

for item <- response, do: item["email"]

请注意,两者的结果之间存在细微的行为差异:前者将过滤掉与左侧不匹配的任何项目(它只会保留带有"email"键的映射),但后者将映射缺少的项目电子邮件至nil.

于 2018-11-27T22:46:07.817 回答