Dictionary 如何检查Elixir中深度嵌套的映射中是否存在密钥

Dictionary 如何检查Elixir中深度嵌套的映射中是否存在密钥,dictionary,elixir,Dictionary,Elixir,我有一个映射对象,我需要检查它是否包含给定的键。我试着像下面这样,但它总是返回错误。还有如何在内部映射回复消息上提取值 map=%{ Envelope: %{ Body: %{ replyMessage: %{ cc: %{ "amount" => "100.00", "reasonCode" => "100",

我有一个映射对象,我需要检查它是否包含给定的键。我试着像下面这样,但它总是返回错误。还有如何在内部映射回复消息上提取值

map=%{
  Envelope: %{
    Body: %{
      replyMessage: %{
        cc: %{
          "amount" => "100.00",
          "reasonCode" => "100",
        },
        decision: "ACCEPT",
        invalidField: nil,
        purchaseTotals: %{"currency" => "CAD"},
        reasonCode: "100",

      }
    }
  }
}
Map.has_key?(map,  %{Envelope: %{Body: %{replyMessage: replyMessage}}})= false

您有两种可能:检查键是否存在和/或深入检索值

iex | 1▶ 匹配?({信封:%{正文:%{回复邮件:{},映射)
#⇒真的
iex | 2▶ 获取(映射,[:信封,:正文,:回复消息])
#⇒ %{
#抄送:%{“金额”=>“100.00”,“原因代码”=>“100”},
#决定:“接受”,
#无效场:零,
#采购总额:%{“货币”=>“加元”},
#理由代码:“100”
# }
小心
内核。get_in/2
将返回
nil
,如果该键存在,但具有
nil
值,或者该键不存在


它不是递归的,它使用映射的键,作为参数传递;也就是说,只有第一级


旁注:根据
Map.has_key/2

defmodule Deep do
@规范有_键?(map::map(),键::[atom())::布尔()
def有_键?(map,_)当不是_键(map)时,do:false
def有_键?(map,[key]),do:map.has_键?(map,key)
def有U键?(映射,[键|尾],
do:Map.has_键?(Map,键)和has_键?(Map[键],尾)
结束
Deep.has_key?(map,[:信封,:Body,:replyMessage])
#⇒真的

谢谢您的回复。我使用的get_in()如下所示。但我认为这是一场比赛?对我来说更有用。case_value=get_in(map,[:信封,:Body,:replyMessage])do nil->map value->value end我该如何订阅你的答案@aleksei matiushkin?@peaclejames我怀疑这在这里是不可能的,但还是谢谢你,我很感激。我有一个博客,elixir RSS在这里: