Ésta es mi serieSuma el valor de hash de matriz en
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
quiero resultar
[{:amount => 30}] or {:amount = 30}
Alguna idea?
Ésta es mi serieSuma el valor de hash de matriz en
[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]
quiero resultar
[{:amount => 30}] or {:amount = 30}
Alguna idea?
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}
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.
@mittag puedes decir ¿Qué debería ser un mejor modelo de objeto? entonces puedo usar este ... a.map (&: amount) .reduce (: +) –
@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
@ sepp2k: ¡Gracias! Perdí ese. –
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
que es principalmente equivalente a este delineador: '' 'total = arr.inject (0) {| sum, hash | sum + = hash [: amount]} '' ' –
[{
:amount=>10,
:gl_acct_id=>1,
:alt_amount=>20
},{
:amount=>20,
:gl_acct_id=>2,
:alt_amount=>30
}].sum { |t| t[:amount] }
¡Bienvenido a Stack Overflow! Por lo general, es mejor __explicar__ tus respuestas, en lugar de simplemente publicar el código. –
¡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. –
Rubí 2.4.0 tiene un método Enumerable#sum. Entonces usted puede hacer
arr.sum {|h| h[:amount] }
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