2014-09-19 3 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} 

당신이 레일을 사용하고 있기 때문에, suminject(:+)

+0

가 왜이 개 여분의 중간 배열을 _suggest_ 않은 다른 현명한 이용, 작동합니까? ('v.values.map (& : to_i)') –

+0

단순함.이 정도의 성능 향상은 무시할 정도로 작다고 생각합니다. 그리고 내 생각 엔이 배열은 2보다 크지 않을 것입니다. :) – Santhosh