如何仅在Ruby中对数组中对象属性的正/负值求和

时间:2012-07-05 17:36:07

标签: ruby arrays sum inject

据我所知,我可以使用inject方法在Ruby中对数组中对象的属性求和。例如,我可以使用以下内容汇总数组中所有代理的现金:

sum_of_cash = agents.inject(0) { |sum, e| sum + e.cash }

但是,如何才能仅对属性的正值或负值求和,例如仅对正或负现金余额求和?

我能想到的一种方法是在数组上进行循环,只有在使用if函数值为正时才进行求和,但如果可能的话,我正在寻找更清晰的方法。

谢谢!

3 个答案:

答案 0 :(得分:4)

我认为这样的事情更优雅

agents.map(&:cash).select { |c| c > 0 }.inject(&:+)

答案 1 :(得分:0)

我可以想到两种方式,在注入中不需要if

  1. 将适当的方法添加到代理对象。然后你可以编写以下代码:

    sum_of_cash = agents.inject(0) { |sum, e| sum + e.positive_cash }

  2. 注射前过滤:

    sum_of_case = agents.map(&:cash).keep_if{|c| c > 0 }.reduce(&:+)

答案 2 :(得分:0)

 agents.select{|e| e.cash > 0}.inject(0) { |sum, e| sum + e.cash }