2016-08-24 5 views
-2

Скажем, у меня есть следующий массив хэшейMerge хэши со значением

[ 
    { 
    created: '11/11/86', 
    amount: 10, 
    }, 
    { 
    created: '11/11/86', 
    amount: 20, 
    }, 
    { 
    created: '12/11/86', 
    amount: 4, 
    } 
] 

Я хочу, чтобы объединить все хэши с тем же created ключом, так что результат будет:

[ 
    { 
    created: '11/11/86', 
    amount: 30, 
    }, 
    { 
    created: '12/11/86', 
    amount: 4, 
    } 
] 

Я понимаю, что могу но я ищу что-то более элегантное.

хэшей может иметь несколько ключей, но я только заботиться о них 2.

+0

Вы что-то пробовали? Что может быть более элегантным, чем цикл? –

+0

В этом мой вопрос. У меня есть работа с циклом, но интересно, есть ли лучший способ. –

+0

Лучше чем? Не могли бы вы поделиться своим решением? –

ответ

5

Вы можете попробовать с map и sum (, так как вы используете рельсы):

arr.group_by{|x| x[:created]}.map{|date, x| 
    { 
    created: date, 
    amount: x.sum{|xx| xx[:amount]} 
    } 
} 

# => {:created=>"11/11/86", :amount=>30}, {:created=>"12/11/86", :amount=>4}] 
1
arr = [ 
    { 
    created: '11/11/86', 
    amount: 10, 
    }, 
    { 
    created: '11/11/86', 
    amount: 20, 
    }, 
    { 
    created: '12/11/86', 
    amount: 4, 
    } 
] 

arr.each_with_object(Hash.new(0)) { |g,h| h[g[:created]] += g[:amount] }. 
    map { |k,v| { created: k, amount: v } } 
    #=> [{:created=>"11/11/86", :amount=>30}, {:created=>"12/11/86", :amount=>4}] 

Первый этап:

arr.each_with_object(Hash.new(0)) { |g,h| h[g[:created]] += g[:amount] } 
    #=> {"11/11/86"=>30, "12/11/86"=>4} 

Hash.new(0) иногда упоминается как подсчет хэш. См. Метод класса Hash::new.

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