Это мой массив
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
Я хочу результат
[{:amount => 30}] or {:amount = 30}
Любая идея?
Это мой массив
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
Я хочу результат
[{:amount => 30}] or {:amount = 30}
Любая идея?
Вы можете использовать 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}
array.map { |h| h[:amount] }.sum
Ruby версии> = 2.4.0 имеет метод подсчета # суммы. Таким образом, вы можете сделать
arr.sum {|h| h[:amount] }
Это один из способов сделать это:
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
.
[{
:amount=>10,
:gl_acct_id=>1,
:alt_amount=>20
},{
:amount=>20,
:gl_acct_id=>2,
:alt_amount=>30
}].sum { |t| t[:amount] }
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