我的值为
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
从iex(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获取它们的值,并使用这些值和匿名键创建一个新映射。
答案 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/1
和Map.take/2
。
changes = Map.keys(%{is_public: true, discoverable: true}) # [:is_public, :discoverable]
Map.take(camera, changes) # %{is_public: true, discoverable: true}