好的,所以这有点复杂,但我需要遍历此哈希,以查找每个元素是否满足以下条件之一:
值是字符串
或
值是一个哈希,包含字符串,而不是哈希
或
值为哈希,包含字符串和/或哈希值
或
数值是数组
更新
有些奇怪...... [编辑:这是因为#collect返回哈希的键值对,即数组]
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"=>"tchapin@gmail.com"
},
{
"rel"=>"work",
"address"=>"tom@tornadodesign.com"}
]
}
答案 0 :(得分: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
编辑:根据Niklas B的建议更新。
答案 1 :(得分: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
}
如果您不想跟踪密钥,可以将#each_pair更改为#values