首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查ruby散列成员是否递归存在?

如何检查ruby散列成员是否递归存在?
EN

Stack Overflow用户
提问于 2017-10-06 16:08:55
回答 2查看 1.3K关注 0票数 0

这有点让人困惑。

如果您有一个包含更多哈希的散列,并且还有散列等等,那么如何确定一个成员是否存在一个以上的层深度?

例如:

代码语言:javascript
复制
hash 1 =
{
    "layer1" => 
    {
        "layer2" => 
        {
            "layer3" => ['Something', 'Array']
        }
    }
}

如果散列中只有:‘某事’,您将如何进行验证:

代码语言:javascript
复制
hash2 =
{
    "layer1" => 
    {
        "layer2" => ['Other Array']
    }
}

例如,我会尝试这样做:

代码语言:javascript
复制
if hash2['layer1']['layer2']['layer3'].contains? 'Something'
  puts "Found Something!"
end

但这将错误未定义的方法“包含?”0:NilClass。其中layer3将是NilClass,因为它不存在。如果这些嵌入的散列中有一个是Nil,然后说它不存在就足够了,但是您不能轻易地测试它们的存在,因为如果您是一个太深的层,也会返回Nil。在ruby中是否有一个函数可以递归地检查每个顶层层的Nil,而不是当您调用.nil?时请求的特定成员,例如,我认为什么才能工作!

代码语言:javascript
复制
if hash2['layer1']['layer2']['layer3'].nil?
  puts 'layer3 exists'
end

但是.nil?只检查“layer3”是否存在。是否有从'layer1‘开始的方法,然后检查'layer2’是否存在,然后检查'layer3‘等等。在任何一个部分都是零,它返回假?因为如果'layer2‘或'layer1’不存在,它就会错误地使用未定义的方法‘[]’表示nil:NilClass。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-06 18:13:31

看看Hash#dig()。它接受一个键数组并递归地查找它们,如果其中任何一个丢失了,则返回nil。从医生那里:

代码语言:javascript
复制
h = { foo: {bar: {baz: 1}}}

h.dig(:foo, :bar, :baz)           #=> 1
h.dig(:foo, :zot)                 #=> nil

请注意,如果baznil,那么第一个dig调用将返回nil。因此,如果您知道不会将nils存储在哈希中,那么它只是检查嵌套密钥是否存在的替代方法。

票数 6
EN

Stack Overflow用户

发布于 2017-10-06 17:58:55

这不是最好的解决方案,但我写了这个:

代码语言:javascript
复制
h = {"layer1"=>
       {"layer2"=>
          {"layer3"=>["Something", "Array"]}
       },
     "layerx" => ["d"],
     "layerz" => {"layera" => "deep"}
}

def vals(h)
  return h if !h.is_a?(Hash)
  h.values.map(&method(:vals)).flatten
end
vals(h) #=> ["Something", "Array", "d", "deep"]

vals给出了嵌套在哈希-es内部的值。您可以检查元素是否在其中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46609835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档