2012-04-06 83 views
1

好了,所以这是一个有点复杂,但我需要循环该散列找到,如果每一个元素符合下列条件之一:深哈希检查

的值是一个字符串

的值是一个哈希,包含字符串,而不是哈希

的值是一个哈希,包含字符串和/或哈希

的值是一个数组

UPDATE:

东西很奇怪的... [编辑:这是因为#收集正在返回散列的键值对,这是阵列]

irb> my_hash['gd:name'].collect(&:class) 
=> [Array, Array] 

查看下面的散列应该该内部元素的类是一个哈希,而不是一个数组?

检查它看起来像:

irb> my_hash['gd:name'].collect(&:inspect) 
=> ["[\"gd:givenName\", {\"$t\"=>\"Thomas\"}]", "[\"gd:familyName\", {\"$t\"=>\"Chapin\"}]"] 

但它像哈希:

irb> my_hash['gd:name']['gd:givenName'] 
=> {"$t"=>"Thomas"} 
irb> my_hash['gd:name']['gd:givenName']['$t'] 
=> "Thomas" 

{ 
    "gd:etag"=>"\"Rnk7fjVSLyt7I2A9WhVQEU4KRQI.\"", 
    "id"=>{ 
    "$t"=>"da513d38e88d949" 
    }, 
    "gd:name"=>{ 
    "gd:givenName"=>{"$t"=>"Thomas"}, "gd:familyName"=>{"$t"=>"Chapin"} 
    }, 
    "gd:phoneNumber"=>[ 
    { 
     "rel"=>"mobile", 
     "$t"=>"(480) 703-4887" 
    } 
    ], 
    "gd:email"=>[ 
    { 
     "rel"=>"home", 
     "primary"=>"true", 
     "address"=>"[email protected]" 
    }, 
    { 
     "rel"=>"work", 
     "address"=>"[email protected]"} 
    ] 
} 
+0

您能澄清一下,如果您的内部散列必须包含* all * strings(或hashes)或至少一个字符串(或散列)? – joelparkerhenderson 2012-04-06 22:12:52

+0

我在内部添加了一个编辑功能,以便其他读者不会感到困惑 - 您可能需要将该块文件取出。 – joelparkerhenderson 2012-04-06 22:50:40

回答

1

与建议更新检查的哈希值。

,则返回true当且仅当每个:

  • 值是一个字符串或数组
  • 值是散列即非空和只包含字符串和/或散列

的溶液用一些打印来显示发生了什么:

puts hash.each_pair.all?{|k,v| 
    puts "key #{k} = value #{v} class #{v.class}" 
    case v 
    when String, Array 
    true 
    when Hash 
    return false if v.empty? 
    v.each_pair.all?{|k2,v2| 
     puts "inner key #{k2} = value #{v2} class #{v2.class}" 
     case v2 
     when String, Hash 
     true 
     else 
     false 
     end 
    } 
    else 
    false 
    end 
} 

如果你不在意保持trac您可以将#each_pair更改为#values

1

您可以测试类的哈希值。

hash.each do |key, value| 
    if value.is_a? String 
    # do String work 
    elsif value.is_a? Hash 
    #do Hash work 
    elsif value.is_a? Array 
    # do Array work 
    end 
end 

编辑:由尼克拉斯·B.

+1

你应该使用'is_a?'来代替:'[String,Hash,Array] .any? {| t | value.is_a?(t)}' – 2012-04-06 21:35:01

+0

...或'Class#==='例如案例价值;当字符串,哈希,数组然后...' – Phrogz 2012-04-06 21:35:57

+0

是否有理由更喜欢is_a?上课,还是只是为了清晰? – 2012-04-06 21:39:21