質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

4017閲覧

配列の中のhashをマージしたい

terate

総合スコア103

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/04/09 08:05

ruby

1ary = [{"num"=>"1", 2"商品名"=>"チョコ", 3"4/12"=>"7", 4"4/13"=>"9", 5"4/14"=>"10", 6"4/15"=>"10", 7"4/16"=>"0", 8"4/17"=>"5", 9"4/18"=>"10"}, 10{"num"=>"2", 11"商品名"=>"ポテト", 12"4/12"=>"0", 13"4/13"=>"0", 14"4/14"=>"0", 15"4/15"=>"0", 16"4/16"=>"0", 17"4/17"=>"0", 18"4/18"=>"0"}, 19{"num"=>"1", 20"商品名"=>"チョコ", 21"4/19"=>"10", 22"4/20"=>"3", 23"4/21"=>"9", 24"4/22"=>"8", 25"4/23"=>"6", 26"4/24"=>"7", 27"4/25"=>"8"}, 28{"num"=>"2", 29"商品名"=>"ポテト", 30"4/19"=>"0", 31"4/20"=>"0", 32"4/21"=>"0", 33"4/22"=>"0", 34"4/23"=>"0", 35"4/24"=>"0", 36"4/25"=>"0"}]

この上の出力から・・

ruby

1ary = [{"num"=>"1", 2"商品名"=>"チョコ", 3"4/12"=>"7", 4"4/13"=>"9", 5"4/14"=>"10", 6"4/15"=>"10", 7"4/16"=>"0", 8"4/17"=>"5", 9"4/18"=>"10" 10"4/19"=>"10", 11"4/20"=>"3", 12"4/21"=>"9", 13"4/22"=>"8", 14"4/23"=>"6", 15"4/24"=>"7", 16"4/25"=>"8"}, 17{"num"=>"2", 18"商品名"=>"ポテト", 19"4/12"=>"0", 20"4/13"=>"0", 21"4/14"=>"0", 22"4/15"=>"0", 23"4/16"=>"0", 24"4/17"=>"0", 25"4/18"=>"0", 26"4/19"=>"0", 27"4/20"=>"0", 28"4/21"=>"0", 29"4/22"=>"0", 30"4/23"=>"0", 31"4/24"=>"0", 32"4/25"=>"0"}]

と、なるように同じnum(同じ商品名)の続きの日付の分のをhashを後ろにマージさせたいのですが、どのようなコードを書けば良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

.group_byで仕分けた上で、それぞれをmergeすればいいかと思います。

ruby

1merged = ary.group_by { |h| h['num'] }.values.map { |hashes| hashes.reduce(&:merge) }

(なお、Enumerable#group_byは、Ruby 2.0以降の機能です。)

投稿2016/04/09 08:10

編集2016/04/09 08:33
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terate

2016/04/13 13:48

ありがとうございます!いつも大変勉強になります!
guest

0

grpup_by を使った回答がでてますが、grpup_by を使わずに書いてみました。
ary.inject(Hash.new({})) { |a, e| a[e['num']] = a[e['num']].merge(e); a }.values
hash['num' ]毎に merge したハッシュをつくり、それを配列に変換しました。
(↓のコード中では、 複数行になってしまうが、inject を使わずに、each でループさせる方法も書いています。
1.rb

ruby

1ary = [{'num'=>'1', 2'商品名'=>'チョコ', 3'4/12'=>'7', 4'4/13'=>'9', 5'4/14'=>'10', 6'4/15'=>'10', 7'4/16'=>'0', 8'4/17'=>'5', 9'4/18'=>'10'}, 10{'num'=>'2', 11'商品名'=>'ポテト', 12'4/12'=>'0', 13'4/13'=>'0', 14'4/14'=>'0', 15'4/15'=>'0', 16'4/16'=>'0', 17'4/17'=>'0', 18'4/18'=>'0'}, 19{'num'=>'1', 20'商品名'=>'チョコ', 21'4/19'=>'10', 22'4/20'=>'3', 23'4/21'=>'9', 24'4/22'=>'8', 25'4/23'=>'6', 26'4/24'=>'7', 27'4/25'=>'8'}, 28{'num'=>'2', 29'商品名'=>'ポテト', 30'4/19'=>'0', 31'4/20'=>'0', 32'4/21'=>'0', 33'4/22'=>'0', 34'4/23'=>'0', 35'4/24'=>'0', 36'4/25'=>'0'}] 37 38ans = Hash.new({}) 39ary.each do |h| 40 ans[h['num']] = ans[h['num']].merge(h) 41end 42puts ans.values 43 44# ↑を1行で記述 45p ' ' 46puts ary.inject(Hash.new({})) { |a, e| a[e['num']] = a[e['num']].merge(e); a }.values

実行結果:

$ ruby 1.rb {"num"=>"1", "商品名"=>"チョコ", "4/12"=>"7", "4/13"=>"9", "4/14"=>"10", "4/15"=>"10", "4/16"=>"0", "4/17"=>"5", "4/18"=>"10", "4/19"=>"10", "4/20"=>"3", "4/21"=>"9", "4/22"=>"8", "4/23"=>"6", "4/24"=>"7", "4/25"=>"8"} {"num"=>"2", "商品名"=>"ポテト", "4/12"=>"0", "4/13"=>"0", "4/14"=>"0", "4/15"=>"0", "4/16"=>"0", "4/17"=>"0", "4/18"=>"0", "4/19"=>"0", "4/20"=>"0", "4/21"=>"0", "4/22"=>"0", "4/23"=>"0", "4/24"=>"0", "4/25"=>"0"} " " {"num"=>"1", "商品名"=>"チョコ", "4/12"=>"7", "4/13"=>"9", "4/14"=>"10", "4/15"=>"10", "4/16"=>"0", "4/17"=>"5", "4/18"=>"10", "4/19"=>"10", "4/20"=>"3", "4/21"=>"9", "4/22"=>"8", "4/23"=>"6", "4/24"=>"7", "4/25"=>"8"} {"num"=>"2", "商品名"=>"ポテト", "4/12"=>"0", "4/13"=>"0", "4/14"=>"0", "4/15"=>"0", "4/16"=>"0", "4/17"=>"0", "4/18"=>"0", "4/19"=>"0", "4/20"=>"0", "4/21"=>"0", "4/22"=>"0", "4/23"=>"0", "4/24"=>"0", "4/25"=>"0"}

投稿2016/04/09 14:46

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terate

2016/04/13 13:49

ありがとうございます!いつも助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問