2013-07-02 3 views
0

나는 다음과 같은 배열이 있습니다변환 루비 배열

array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 

나는 1 큰 해시로 변환하지만, 모든 값을 유지하려면, 그래서 그것은 다음과 같이 할을 :

{"a" => [2, nil], "b" => [3, nil], "c" => [2]} 

나는 가까운 array.inject({}) {|s, h| s.merge(h)}} 일을 얻을 수 있지만 값을 덮어 씁니다.

모든 아이디어를 높이 평가합니다!

+1

그것은 더 의미가' "C"=> [2] '에 해시를 할 수 있도록하지 않을까요? –

+0

그것도 잘 작동합니다. – BC00

답변

2
array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 
a = array.each_with_object(Hash.new([])) do |h1,h| 
    h1.each{|k,v| h[k] = h[k] + [v]} 
end 
a # => {"a"=>[2, nil], "b"=>[3, nil], "c"=>[2]} 
0
array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 
res = {} 

array.each do |hash| 
    hash.each do |k, v| 
    res[k] ||= [] 
    res[k] << v 
    end 
end 
+0

'res = {}'를'res = Hash.new []'로 바꾸면'res [k] || = []'줄을 없앨 수 있습니다. – naomik

+0

@ 이런 식으로. 해쉬를 기본값으로 사용할 때 이상한 일들이 발생합니다. –