как получить значения на основе ключей от Struct Elixir - PullRequest
4 голосов
/ 25 июня 2019

У меня есть это значение как

%{is_public: true, discoverable: true}

Это может быть что-то не определенно is_public и discoverable, но все keys, которые будут выше Map, будут доступны в struct камеры.

%Camera{
  __meta__: #Ecto.Schema.Metadata<:loaded, "cameras">,
  created_at: #DateTime<2017-08-25 14:13:55.524563Z>,
  discoverable: true,
  exid: "everc-fhlcr",
  id: 12769,
  is_online: true,
  is_online_email_owner_notification: false,
  is_public: true,
  last_online_at: #DateTime<2019-05-14 11:10:45.000000Z>,
  last_polled_at: #DateTime<2019-05-14 11:10:47.000000Z>,
}

Я хочу получить значения из структуры Camera на основе Map т.е. 1014 *

iex(4)> changes = %{is_public: true, discoverable: true} |> Map.keys
[:discoverable, :is_public]

Я могу получить ключи от карты изменений с помощью Map.keys

Но я не уверен, как отобразить значения из структуры камеры.

сверху Camera Struct и изменяет карту, я хочу получить этот тип карты.

%{
 is_public: true,
 discoverable: true
}

похоже на ту же карту выше, но это зависит от значений Camera Struct, они оба могут быть ложными или истинными, так же как и id, exid, is_online.

Если я сделаю это

Enum.map(changed_keys, fn(key) ->
  key: Map.get(camera, key)
end)

Это все еще не работает, любая помощь будет заметна. спасибо

Я просто хочу создать карту с анонимными ключами в changes Карта, а затем получить их значения из Camera Структурировать и создать новую карту с этими значениями и ключами анонимных пользователей.

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Первая задача - извлечь нужные ключи - это уже отлично сделано с:

Map.keys(my_map)

Передача %{is_public: true, discoverable: true} как my_map сделка:

iex> Map.keys(%{is_public: true, discoverable: true})
[:is_public, :discoverable]

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

К счастью, в стандартной библиотеке у нас есть такая функция: Map.take

Мы можем использовать ее следующим образом:

Map.take(camera, [:discoverable, :is_public])

или (в частном случае)

Map.take(camera, changes)

2 голосов
/ 25 июня 2019

FWIW, я бы опубликовал решение, которое использует Kernel.SpecialForms.for/1 понимание.Здесь это, вероятно, ovekill, но в целом это дает больше гибкости при фильтрации и дальнейшей обработке:

for {k, v} <- camera, k in [:discoverable, :is_public],
  do: {k, v}, into: %{}
#⇒ %{discoverable: true, is_public: true}
1 голос
/ 25 июня 2019

Используйте комбинацию Map.keys/1 и Map.take/2.

changes = Map.keys(%{is_public: true, discoverable: true})  # [:is_public, :discoverable]

Map.take(camera, changes)  # %{is_public: true, discoverable: true}
...