Ceci est mon tableau
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
je veux un résultat
[{:amount => 30}] or {:amount = 30}
Une idée?
Vous pouvez utiliser inject
pour additionner tous les montants. Vous pouvez ensuite simplement remettre le résultat dans un hachage si vous en avez besoin.
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
Les versions Ruby> = 2.4.0 ont une méthode Enumerable # sum . Vous pouvez donc faire
arr.sum {|h| h[:amount] }
C'est une façon de procéder:
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(:+)
Cependant, j'ai l'impression que votre modèle d'objet manque quelque peu. Avec un meilleur modèle d'objet, vous pourriez probablement faire quelque chose comme:
a.map(&:amount).reduce(:+)
Ou même juste
a.sum
Notez que comme @ sepp2k l'a fait remarquer, si vous voulez sortir un Hash
, vous devez à nouveau l'envelopper dans un Hash
.
[{
:amount=>10,
:gl_acct_id=>1,
:alt_amount=>20
},{
:amount=>20,
:gl_acct_id=>2,
:alt_amount=>30
}].sum { |t| t[:amount] }