Получить данные из массива JSON - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть массив 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", ....]

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

В дополнение к карте вы также можете посмотреть на понимание .По сути, они сочетают в себе функциональность Enum.map / 2 & Enum.filter / 2 .

. Они позволяют вам делать что-то вроде этого:

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

или это:

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

Примечание есть небольшая разница в поведении между результатом двух: первый отфильтрует все элементы, которые не соответствуют левомусо стороны (он будет хранить карты только с ключом "email"), но последний будет отображать элементы без электронного письма на nil.

0 голосов
/ 26 ноября 2018

Вы ищете Enum.map/2. Этот метод вызывает переданную функцию для каждого элемента в данном списке / перечислимый:

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

В качестве альтернативыВы можете использовать сокращение и сделать его кратким:

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

Внешние ресурсы: См. это и также это чтобы понять концепцию отображения в функциональном программировании в целом.

Примечание: flat_map/2 - это вариант map/2 который ожидает, что «сопоставленный результат» будет другим списком (поэтому его можно объединить и сгладить с остальными сопоставленными результатами).

...