【问题标题】:how to get values basis on keys from a Struct Elixir如何根据 Struct Elixir 中的键获取值
【发布时间】:2019-06-25 19:53:40
【问题描述】:

我有这个值

%{is_public: true, discoverable: true}

这可以是任何不具体的 is_publicdiscoverable,但所有将出现在 Map 之上的 keys 将在相机的 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>,
}

我想在Map的基础上从Camera结构中获取值,即

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)

这仍然不起作用,任何帮助都会很明显。谢谢

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

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

    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】:

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

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

      【讨论】:

      • 我不知道into 选项。酷!
      • @OleksiiFilonenko 还有reduce: 从今天开始发布1.9
      • 我在等你的回答:)
      【解决方案3】:

      使用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}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多