2012-04-06 121 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