Este es mi matriz

[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]

quiero resultado

[{:amount => 30}] or {:amount = 30}

Alguna idea?

InformationsquelleAutor krunal shah | 2010-09-16

6 Comentarios

  1. 57

    Puede utilizar inject a la suma de todas las cantidades. Usted puede, a continuación, sólo hay que poner el resultado en un hash, si es necesario.

    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}
    • gracias @sepp2k esto es muy útil. en la respuesta anterior tenemos que el nombre de la clave – ¿qué pasa si queremos que la suma de todas las teclas (es decir, no queremos a nombre de ellos individualmente – ¿sabe usted cómo íbamos a resolver eso?)
    • Tengo el mismo problema, mi hash es [2, #<BigDecimal:7f29fe6164b0,’0.1256E4′,9(18)>, 4, #<BigDecimal:7f29fe6163e8,’0.281E4′,9(18)>, 3, #<BigDecimal:7f29fe6162a8,’0.24E4′,9(18)>] y quiero suma de los valores que no tienen nombre.
  2. 58

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

    • Debe señalarse, este es un rieles de extensión…
    • y mientras que el uso de carriles, podría ser más corto: de la matriz.sum {|h| h[:cantidad]}
    • Esto crea una matriz temporal, que puede ser evitado.
  3. 47

    Versiones de Ruby >= 2.4.0 tiene un Enumerable#suma método. Así que usted puede hacer

    arr.sum {|h| h[:amount] }
    • probablemente la mejor respuesta en mi humilde opinión
  4. 10

    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 escaso. Con un mejor modelo de objetos, que probablemente sería capaz de hacer algo como:

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

    O incluso sólo

    a.sum

    Tenga en cuenta que como @sepp2k señalado, si usted desea conseguir un Hash, usted necesita para envolver en un Hash de nuevo.

    • puede usted decirme lo que debería ser un mejor modelo de objetos ?? así que puede usar este … una.mapa(&:cantidad).reducir(:+)
    • Ejemplo más básico: Foo = Struct.new(:amount, :gl_acct_id, :alt_amount); a = [Foo.new(10, 1, 20), Foo.new(20,2,30)]; a.map(&:amount).inject(:+) #=> 30
    • Gracias! Faltó que uno.
  5. 3
    [{
        :amount=>10,
        :gl_acct_id=>1,
        :alt_amount=>20
    },{
        :amount=>20,
        :gl_acct_id=>2,
        :alt_amount=>30
    }].sum { |t| t[:amount] }
    • Bienvenido a Desbordamiento de Pila! Es generalmente mejor para explique sus respuestas, en lugar de simplemente enviar el código.
    • Bienvenido a Desbordamiento de Pila! Aunque este código puede ayudar a resolver el problema, no explica porque y/o como contesta a la pregunta. La prestación de este contexto adicional mejorará con el tiempo su valor educativo. Por favor, editar su respuesta a agregar explicación, incluyendo lo que las limitaciones y supuestos que se aplican.
  6. -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
    • que es casi equivalente a este one-liner: total = arr.inject(0) {|sum, hash| sum += hash[:amount]}

Dejar respuesta

Please enter your comment!
Please enter your name here