2017-09-21 7 views
0

私は実際には2つの配列の組み合わせである次の配列を持っています。私の目標は、従業員IDが898989である2つのハッシュを組み合わせて、それらの数を合計してそのタイプを両方に変更できるということです。私は私のハッシュの他の値を失うが、私が欲しいものに近いです下のコードを試してみました。すべての値をマップし、私が望むようにカウントを追加するような操作をする簡単な方法はありますか?Rubyは同じキーと複数の値を持つハッシュの配列を結合します

combined = [{"@rid"=>"#-2:1", "employeeId"=> "898989", "count"=>1, :type=>"wiki" }, 
     {"@rid"=>"#-2:3", "employeeId"=> "2423213", "count"=>7, :type=>"search"}, 
     {"@rid"=>"#-2:2", "employeeId"=> "555555", "count"=>2, :type=>"search"}, 
     {"@rid"=>"#-2:5", "employeeId"=> "898989", "count"=>2, :type=>"search"}, 
     {"@rid"=>"#-2:1", "employeeId"=> "5453454", "count"=>1, :type=>"search"}, 
     {"@rid"=>"#-2:4", "employeeId"=>"987654321", "count"=>1, :type=>"search"}] 

merged_array_hash = combined.group_by { |h1| h1["employeeId"] }.map do |k,v| 
    { "employeeId" => k, :types => v.map { |h2| h2[:type] }.join(", ") } 
end 

merged_array_hashはビーイングを終わる:

[{employeeId: "898989",types: "wiki, search"}, 
{employeeId: "2423213",types: "search"}, 
{employeeId: "555555",types: "search"}, 
{employeeId: "5453454",types:"search"}, 
{employeeId: "987654321",types: "search"}] 

私が取得しているよ何を:

[{employeeId: "898989",type: "both", count: 2}, 
{employeeId: "2423213",type: "search", count: 7}, 
{employeeId: "555555",type: "search", count: 2}, 
{employeeId: "5453454",type:"search", count: 1}, 
{employeeId: "987654321",type: "search", count: 1}] 
+0

このコードは実行されません。変数 'wiki'と' search'が保持するはずのことを説明できますか? – Zack

+1

例を挙げると、Rubyオブジェクトとして望ましい結果が表示されます。 ( "combined = wiki + search"はその要件を満たしていません)また、各入力オブジェクトに変数を割り当てると便利です(ここにはおそらく 'arr = [{" @arid "=> ... }、{...}] ')。そうすることで、読者は答えやコメントの中のそれらの変数を定義することなく参照することができ、誰もが同じ変数名を使用します。 –

+0

私は編集を気にしないと信じています。私は読者が水平にスクロールする必要がないように再フォーマットし、配列の変数名を追加しました。 –

答えて

0

ない美しいが、それは仕事を得るでしょう:

combined.group_by { |h1| h1["employeeId"] }.map do |k,v| 
    types = v.map { |h2| h2[:type] } 
    count = v.sum { |x| x['count'] } 

    { employeeId: k, 
    types: (types.length == 1 ? types[0] : 'both'), 
    count: count } 

end 

=> [{:employeeId =>"898989", :types=>"both", :count=>3}, 
    {:employeeId =>"2423213", :types=>"search", :count=>7}, 
    {:employeeId =>"555555", :types=>"search", :count=>2}, 
    {:employeeId =>"5453454", :types=>"search", :count=>1}, 
    {:employeeId =>"987654321", :types=>"search", :count=>1}] 
+0

私はこのソリューションを実装しましたが、そのトリックを行うようです。あなたの助けをありがとう、私はそれを感謝します。 –

0

また美しくない、またtを得る彼の仕事は、潜在的に読みやすく、行わ

hash = {} 
combined.each do |h| 
    employeeId, count, type = h.values_at("employeeId", "count", :type) 
    if hash.include? employeeId 
    hash[employeeId][:count] += count 
    hash[employeeId][:type] = "both" #assumes duplicates can only occur if item is in both lists 
    else 
    hash[employeeId] = { :employeeId => employeeId, :type => type, :count => count } 
    end 
end 
hash.values 

テスト:

[{:employeeId=>"898989", :type=>"both", :count=>3}, 
{:employeeId=>"2423213", :type=>"search", :count=>7}, 
{:employeeId=>"555555", :type=>"search", :count=>2}, 
{:employeeId=>"5453454", :type=>"search", :count=>1}, 
{:employeeId=>"987654321", :type=>"search", :count=>1}]