2014-09-19 55 views

回答

1

做如下

# If you are in Ruby 2.1 or greater 
your_hash.map { |k,v| [k, v.reduce(0) { |sum, (_, v)| sum + v.to_i }] }.to_h 
# => {"Mechnical"=>30, "Civil"=>30} 

# below Ruby 2.1 
Hash[your_hash.map { |k,v| [k, v.reduce(0) { |sum, (_, v)| sum + v.to_i }] }] 
# => {"Mechnical"=>30, "Civil"=>30} 

# for all versions 
your_hash.each_with_object({}) do |(k,v), h| 
    h[k] = v.reduce(0) { |sum, (_, v)| sum + v.to_i } 
end 
# => {"Mechnical"=>30, "Civil"=>30} 
1
h = { "Mechnical" => {"boys" => "25", "girls"=>"5"}, 
     "Civil"=> {"boys"=>"18", "girls"=>"12"} } 

h.map { |k, v| [k, v.values.map(&:to_i).sum] }.to_h 
# => {"Mechnical"=>30, "Civil"=>30} 

或者

Hash[ h.map { |k, v| [k, v.values.map(&:to_i).sum]} ] 
# => {"Mechnical"=>30, "Civil"=>30} 

由于您使用Rails,sum会的工作,其他的合理使用inject(:+)

+0

你为什么_suggest_ 2个额外的中间阵列? ('v.values.map(&:to_i)') – 2014-09-19 13:20:24

+0

简单......我认为在这个规模下,性能增益可以忽略不计。我的猜测是这个数组不会大于2. :) – Santhosh 2014-09-19 15:34:52