如果密钥存在,则向哈希值添加值

时间:2013-12-20 12:26:58

标签: ruby-on-rails ruby hash map ruby-on-rails-4

我有一些看起来像这样的数据:

[["2000475042", "1"], [{:match_day_uid=>"2000475042", :external_player_uid=>"88", :external_team_uid=>"1", :player_display_name=>"Cardin Constance", :team_display_name=>"Alpha Monkeys", :score=>33}, ...]]

[["2000475042", "2"], [{:match_day_uid=>"2000475042", :external_player_uid=>"253", :external_team_uid=>"2", :player_display_name=>"Cochran Callahan", :team_display_name=>"Ghost Commandos", :score=>169}, ...]]

...

数据按第一个数组中的两个ID match_day_uidexternal_team_uid进行分组,然后列出第二个数组中匹配数据的每个实例。

我想用这个数据创建一个新哈希,其中分组是match_day_uid,其中每个团队的数据都在由external_team_uid键入的哈希中。

目前我的代码如下:

def output
  output = {}
  data_stream.each { |identifiers, data|
    output[identifiers[0]] = {  
      :external_team_uid  => identifiers[1],
      :team_score         => data.map { |p| p[:score] }.inject(:+),
      :data               => [ data ]
    }  
  }  
  output
end

输出'正确' - 我可以调用output["2000475042"]并获取数据,如下所示:

{:external_team_uid=>"3", :team_score=>1026, :data=>[ <all the data here> ]}

但是只有一个团队 - 这意味着每次都会覆盖密钥的值,并且我留下了最后一次迭代的任何团队的数据。

如何将所有团队的数据作为一个键的值(即match_day_id)获取?

所需输出

:match_days => {
  :match_day_1 = [
    '3' => {:external_team_uid=>"3", :team_score=>1026, :data=>[ <all the data here> ]},
    '4' => {:external_team_uid=>"4", :team_score=>2222, :data=>[ <all the data here> ]},
    etc...
  ],
  :match_day_1 = [
    '3' => {:external_team_uid=>"3", :team_score=>415, :data=>[ <all the data here> ]},
    '4' => {:external_team_uid=>"4", :team_score=>9644, :data=>[ <all the data here> ]},
    etc...
  ]
  ...
}

1 个答案:

答案 0 :(得分:1)

def convert(data_stream)
output = {}
  data_stream.each { |identifiers, data|
  output[identifiers[0]] ||= []
    output[identifiers[0]] << {  
      :external_team_uid  => identifiers[1],
      :team_score         => data.map { |p| p[:score] }.inject(:+),
      :data               => [ data ]
    }  
  }  
  output
end