2010-09-16 21 views

Respuesta

47

Puede usar inject para sumar todos los valores. A continuación, puede volver a poner el resultado en un hash si lo necesita.

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} 
+0

gracias @ sepp2k Esto es muy útil. en la respuesta anterior tenemos que nombrar la clave, ¿y si queremos la suma de todas las claves? (es decir, no queremos nombrarlas individualmente, ¿sabes cómo resolveríamos eso?) – BKSpurgeon

8

Esta es una manera de hacerlo:

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(:+) 

Sin embargo, tengo la sensación de que su modelo de objetos es un poco deficiente. Con un mejor modelo de objetos, que probablemente sería capaz de hacer algo como:

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

O incluso

a.sum 

Tenga en cuenta que como @ sepp2k señaló, si usted desea conseguir un Hash, necesita envolverlo en un Hash nuevamente.

+0

@mittag puedes decir ¿Qué debería ser un mejor modelo de objeto? entonces puedo usar este ... a.map (&: amount) .reduce (: +) –

+2

@krunal: Ejemplo más básico: 'Foo = Struct.new (: cantidad,: gl_acct_id,: alt_amount); a = [Foo.new (10, 1, 20), Foo.new (20,2,30)]; a.map (&: amount) .inject (: +) # => 30' – sepp2k

+0

@ sepp2k: ¡Gracias! Perdí ese. –

-2
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 
+0

que es principalmente equivalente a este delineador: '' 'total = arr.inject (0) {| sum, hash | sum + = hash [: amount]} '' ' –

48

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

+6

Cabe señalar, esta es una extensión de raíles ... – Rob

+3

y durante el uso de raíles, podría ser más corto: array.sum {| h | h [: amount]} – alostr

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

¡Bienvenido a Stack Overflow! Por lo general, es mejor __explicar__ tus respuestas, en lugar de simplemente publicar el código. –

+0

¡Bienvenido a Stack Overflow! Aunque este código puede ayudar a resolver el problema, no explica "por qué" y/o "cómo" responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor educativo a largo plazo. Por favor [edite] su respuesta para agregar una explicación, incluyendo qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas