Преобразуйте список карт в эликсир - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть список карт, который я получаю из запросов к моей базе данных. В нем есть поле даты и времени, которое я хочу преобразовать в другой список карт, где поле даты и времени преобразуется в соответствующее значение эпохи.

Что у меня есть:

[
  %{
    m_id: 267,
    end: #DateTime<2020-03-07 17:30:00Z>,
    start: #DateTime<2020-03-07 14:30:00Z>,
    type: "normal",
    s_name: "smum",
    w_id: 256
  },
  %{
    m_id: 267,
    end: #DateTime<2020-03-07 07:30:00Z>,
    start: #DateTime<2020-03-07 04:30:00Z>,
    type: "normal",
    s_name: "smum",
    w_id: 256
  }
]

Что я хочу преобразовать в:

[
  %{
    m_id: 267,
    end: 12356789, #some epoch value for eg
    start: 12367576, #some epoch value for eg
    type: "normal",
    s_name: "smum",
    w_id: 256
  },
  %{
    m_id: 267,
    end: 12334567, #some epoch value for eg
    start: 12354767, #some epoch value for eg
    type: "normal",
    s_name: "smum",
    w_id: 256
  }
]

Ответы [ 2 ]

5 голосов
/ 11 февраля 2020

Чтобы преобразовать одну карту, вы можете сделать

%{map | end: DateTime.to_unix(map.end), start: DateTime.to_unix(map.start) }

Так что просто Enum.map над списком, чтобы применить это ко всем членам списка:

Enum.map(list, fn map -> %{map | end: DateTime.to_unix(map.end), start: DateTime.to_unix(map.start) } end)

(я подозревал, что там может быть проблема с использованием синтаксиса обновления карты здесь, потому что end является зарезервированным словом, но я проверил в https://www.jdoodle.com/execute-elixir-online/, и это работает.)

2 голосов
/ 11 февраля 2020

Я бы go с Kernel.SpecialForms.for/1 пониманием.

for %{start: s, end: e} = map <- list do
  %{map | start: DateTime.to_unix(s), end: DateTime.to_unix(e)}
end

Это немного отличается от Enum.map/2 решения, потому что оно отбросило бы эти элементы не с ключами start или end. Чтобы правильно с этим справиться, нужно использовать Map.update/4 с умом.

...