web-dev-qa-db-fra.com

Additionner la valeur du tableau dans le hachage

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?

43
krunal shah

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}
57
sepp2k

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

58
Zsolt Hanko

Les versions Ruby> = 2.4.0 ont une méthode Enumerable # sum . Vous pouvez donc faire

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

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.

10
Jörg W Mittag
[{
    :amount=>10,
    :gl_acct_id=>1,
    :alt_amount=>20
},{
    :amount=>20,
    :gl_acct_id=>2,
    :alt_amount=>30
}].sum { |t| t[:amount] }
3
Luis Tofoli