Как добавить значения из двух разных массивов хэшей вместе? - PullRequest
3 голосов
/ 08 декабря 2010

У меня есть два массива хэшей. Ключи для хэшей разные:

player_scores1 = [{:first_name=>"Bruce", :score => 43, :time => 50},
                  {:first_name=>"Clark", :score => 45, :minutes => 20}]

player_scores2 = [{:last_name=>"Wayne", :points => 13, :time => 40},
                  {:last_name=>"Kent", :points => 3, :minutes => 20}]

Я хотел бы создать новый массив хэшей, который складывает: score и: points вместе и назначает его клавише с именем: score Я также хотел бы объединить: first_name и: last_name и назначить его ключу с именем: full_name. Я хочу сбросить любые другие ключи.

Это приведет к следующему массиву:

all_players = [{:full_name => "Bruce Wayne", :score => 56}, 
               {:full_name => "Clark Kent", :score => 48}]

Есть ли элегантный способ сделать это?

Ответы [ 4 ]

8 голосов
/ 08 декабря 2010

Примерно так:

player_scores1.zip(player_scores2).map { |a,b|
    {
        :full_name => a[:first_name]+' '+b[:last_name],
        :score => a[:score]+b[:points]
    }
}
0 голосов
/ 08 декабря 2010

Используется zip с блоком для циклического перебора хешей, объединения имен и суммирования:

all_players = []
player_scores1.zip(player_scores2) { |a, b| 
  all_players << { 
    :full_name => a[:first_name] + ' ' + b[:last_name],
    :score     => a[:score] + b[:points]
  } 
}
all_players # => [{:full_name=>"Bruce Wayne", :score=>56}, {:full_name=>"Clark Kent", :score=>48}]
0 голосов
/ 08 декабря 2010

Это работает.Не знаю, если это достаточно элегантно.

player_scores1 = [{:first_name=>"Bruce", :score => 43, :time => 50},
                  {:first_name=>"Clark", :score => 45, :minutes => 20}]

player_scores2 = [{:last_name=>"Wayne", :points => 13, :time => 40},
                  {:last_name=>"Kent", :points => 3, :minutes => 20}]

p (0...[player_scores1.length, player_scores2.length].min).map {|i| {
    :full_name => player_scores1[i][:first_name] + " " + player_scores2[i][:last_name], 
    :score => player_scores1[i][:score] + player_scores2[i][:points]
}}

Этот пример на Codepad .

0 голосов
/ 08 декабря 2010

Код, который вы ищете:

final = []
player_scores1.each_index do |index|
  entry_1 = player_scores1.values(index)
  entry_2 = player_scores2.values(index)[:first_name]
  score = entry_1[:score] + entry_2[:points]
  final << {:full_name => "#{entry_1[:first_name]} #{entry_2[:last_name]}", :score => score }
end

Буду очень признателен за любые предложения по ужесточению этого вопроса!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...