Подтвердить что ты не робот

Суммировать значение массива в хеше

Это мой массив

[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]

Я хочу результат

[{:amount => 30}] or {:amount = 30}

Любая идея?

4b9b3361

Ответ 1

Вы можете использовать inject для суммирования всех сумм. Затем вы можете просто вернуть результат в хэш, если вам нужно.

arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]    
amount = arr.inject(0) {|sum, hash| sum + hash[:amount]} #=> 30
{:amount => amount} #=> {:amount => 30}

Ответ 2

array.map { |h| h[:amount] }.sum

Ответ 3

Ruby версии> = 2.4.0 имеет метод подсчета # суммы. Таким образом, вы можете сделать

arr.sum {|h| h[:amount] }

Ответ 4

Это один из способов сделать это:

a = {amount:10,gl_acct_id:1,alt_amount:20},{amount:20,gl_acct_id:2,alt_amount:30}
a.map {|h| h[:amount] }.reduce(:+)

Однако у меня возникает ощущение, что ваша объектная модель несколько не хватает. С лучшей объектной моделью вы, вероятно, сможете сделать что-то вроде:

a.map(&:amount).reduce(:+)

Или даже просто

a.sum

Обратите внимание, что, как указывал @sepp2k, если вы хотите выйти из Hash, вам нужно снова обернуть его в Hash.

Ответ 5

[{
    :amount=>10,
    :gl_acct_id=>1,
    :alt_amount=>20
},{
    :amount=>20,
    :gl_acct_id=>2,
    :alt_amount=>30
}].sum { |t| t[:amount] }

Ответ 6

total=0
arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]
arr.each {|x| total=total+x[:amount]}
puts total