2013-12-23 62 views
1

我有以下哈希。我想用相同的值來檢測哈希值,並對值進行組合。有沒有辦法在ruby中有效地做到這一點?Ruby:基於兩個鍵值的組合檢測哈希中的重複

attributes = {"0"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3"}, "1"=>{"from"=>"xxx", "to"=>"zzz", "value"=>"3.5"}, "2"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3.5"}}

這裏屬性[ 「2」]是屬性的複製[ 「0」](因爲它們具有從和向值相同)。我想檢測這個並引發異常。誰能幫我嗎?

+0

,你能否告訴預期的輸出? –

+0

這個哈希是來自一個表單,如果他輸入了重複的值,我想向用戶提供一個錯誤信息。 – jithendhir92

回答

1

我會做如下:

attributes = {"0"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3"}, "1"=>{"from"=>"xxx", "to"=>"zzz", "value"=>"3.5"}, "2"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3.5"}} 
bol = attributes.group_by{|_,v| v.values_at("from","value") }.any?{|_,v| v.size >= 2 } 
raise "exception" if bol 
+0

非常感謝。.. :)我需要和值組合,所以這一行將是:'bol = attributes.group_by {| _,v | v.values_at(「from」,「to」)} .any?{| _,v | v.size> = 2}' – jithendhir92

+1

@ sudo-stupid在我眼中的錯字。我寫的任何方式都是建議或者技巧,你可以使用。 :) –

1

嘗試代碼:

# => {"0"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3"}, "1"=>{"from"=>"xxx", "to"=>"zzz", "value"=>"3.5"}, "2"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3.5"}} 

attributes.each do|k,a| 
    sel = attributes.select {|_,b| b['from'] == a['from'] && b['to'] == a['to'] } 
    p sel 
    raise Exception if sel.size > 1 
end 

# {"0"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3"}, "2"=>{"from"=>"xxx", "to"=>"yyy", "value"=>"3.5"}} 
1
> valid = h.to_a.uniq {|a| [a.last['from'], a.last['to']] }.length == h.keys.length 
=> false 

raise 'hash is not unique' unless valid 
相關問題