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

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

ただいまの
回答率

90.48%

  • Ruby

    7938questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,529

terate

score 88

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

この上の出力から・・

ary = [{"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(同じ商品名)の続きの日付の分のをhashを後ろにマージさせたいのですが、どのようなコードを書けば良いでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/13 22:48

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

    キャンセル

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

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

ans = Hash.new({})
ary.each do |h|
  ans[h['num']] = ans[h['num']].merge(h)
end
puts ans.values

# ↑を1行で記述
p ' '
puts 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/13 22:49

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Ruby

    7938questions

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