0

ちょっと私は次のようなハッシュ値の配列を持っています。

[{"group" => "1", "message" => "hey", "weight" => 1}, {"group" => "1", "message" 
 => "hey1", "weight" => 2}, {"group" => "2", "message" => "hey3", "weight" => 4}]

group_by グループ化し、次のようにフォーマットします。

[{"group" => 1, "messages" => {"hey","hey1"}, "weights" => {1,2}}, {"group" => 2,
  "messages" => {"hey3"}, "weights" => {4}}]

これを達成するための素敵なルビーの方法はありますか?

編集:今私は持っています:

[
  {"group" => "1", "message" => {"hey" => "1"}},
  {"group" => "1", "message" => {"hey1" => "2"}}
]

私はしたいです

{"group" => "1", "messages" => {"hey1" => "1", "hey2" => "2"} }
4

2 に答える 2

2

修正された質問に基づいて:

groups = [
  {"group" => "1", "message" => {"hey" => "1"}},
  {"group" => "1", "message" => {"hey1" => "2"}}
]

merged = groups.inject do |h1,h2|
  h1.merge(h2) do |k,v1,v2|
    if v1==v2
      v1
    elsif v1.is_a?(Hash) && v2.is_a?(Hash)
      v1.merge(v2)
    else
      [*v1,*v2]
    end
  end
end

p merged
#=> {"group"=>"1", "message"=>{"hey"=>"1", "hey1"=>"2"}}
于 2012-06-20T20:07:03.160 に答える
1

あなたが望む出力は次のとおりだと思います:

[{"messages"=>["hey", "hey1"], "weights"=>[1, 2], "group"=>"1"}, {"messages"=>["hey3"], "weights"=>[4], "group"=>"2"}]

この場合、このコードはあなたが望むことを行います:

h.group_by { |item| item["group"] }.values.map do |item|
    item.inject({"messages" => [], "weights" => []}) do |result, subitem|
        result["group"] = subitem["group"]
        result["messages"] << subitem["message"]
        result["weights"] << subitem["weight"]
        result
    end
end

特定の問題について詳しく知ることで改善できるはずですが、それは良い出発点になるはずです。

于 2012-06-20T19:55:40.787 に答える