2015-06-15 2 views
-4

У меня есть список, как показано ниже:как можно перебрать массив массив хэшей в рубине

order = [ 
    {term: 201, x: 2}, 
    {term: 201, y: 7}, 
    {term: 201, z: 2}, 
    {term: 202, a: 3}, 
    {term: 202, b: 4}, 
    {term: 202, c: 0} 
] 

, как я могу получить этот результат?

[ 
    {term: 201, x: 2, y: 7, z: 2}, 
    {term: 202, a: 3, b: 4, c: 0}, 
] 
+1

Пожалуйста, проявите некоторое усилие. Вам необходимо перебрать существующие хэши и объединить их, когда значения под их «терминальными» ключами равны –

+0

order.each do | a | a.each do | h | h.each do | k, v | нужно что-то сделать здесь – jissy

+3

Вы получаете заметку, потому что вы не говорите, что ваши требования, кроме «Я хочу получить этот результат от этих данных». Вы должны были сказать что-то вроде «Я хочу один хэш в результатах для каждого значения« term », который объединяет все значения хэшей с этим значением для« term »или что-то еще, если это не то, что вы хотеть сделать. –

ответ

4

Вы можете использовать group_by метод:

order.group_by { |h| h[:term] } 
    .map { |_, v| v.inject(:update) } 
# => [{:term=>201, :x=>2, :y=>7, :z=>2}, {:term=>202, :a=>3, :b=>4, :c=>0}] 
  • группа малых хэш их термы числа.

  • Затем перебирайте каждую группу небольших хэшей.

  • Итерация объединяет все мелкие хэши, чтобы сделать один.

Смежные вопросы