如何从Struct Elixir的键获取值

时间:2019-06-25 07:05:41

标签: elixir

我的值为

is_public

这可能不是具体的discoverablekeys,但是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

我想基于Mapiex(4)> changes = %{is_public: true, discoverable: true} |> Map.keys [:discoverable, :is_public] 结构中获取值,即

Map.keys

我可以使用%{ is_public: true, discoverable: true }

从更改映射中获取密钥

但是我不确定如何从Camera结构映射值。

从“摄像机结构”上方并更改地图,我想获取这种类型的地图。

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

上面的地图似乎相同,但是取决于Camera Struct的值,它们都可以为false或true,与id,exid和is_online相同。

如果我这样做

changes

这仍然行不通,将不胜感激。谢谢

我只想在Camera Map中创建一个带有匿名键的映射,然后从return Struct获取它们的值,并使用这些值和匿名键创建一个新映射。

3 个答案:

答案 0 :(得分:3)

第一个任务是提取所需的密钥-已经完美完成了:

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)

答案 1 :(得分:2)

FWIW,我将发布使用Kernel.SpecialForms.for/1理解的解决方案。在这里,它可能是一个杀手kill,但总的来说,它为过滤和任何进一步的处理提供了更大的灵活性:

for {k, v} <- camera, k in [:discoverable, :is_public],
  do: {k, v}, into: %{}
#⇒ %{discoverable: true, is_public: true}

答案 2 :(得分:1)

同时使用Map.keys/1Map.take/2

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

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