首页 > 解决方案 > 如何根据 Struct Elixir 中的键获取值

问题描述

我有这个价值

%{is_public: true, discoverable: true}

这可以是任何不具体的is_publicdiscoverable,但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>,
}

我想在ieCamera的基础上从结构中获取值Map

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

我可以从更改地图中获取密钥Map.keys

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

从上面的Camera Struct和改变地图,我想得到这种类型的地图。

%{
 is_public: true,
 discoverable: true
}

看起来与上面的地图相同,但它取决于 Camera Struct 值,它们都可以是 false 或 true ,与 id、exid、is_online 相同。

如果我这样做

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

这仍然不起作用,任何帮助都是可观的。谢谢

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

标签: elixir

解决方案


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

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)


推荐阅读