从数组中获取哈希值(来自多个哈希值)并将它们相加

时间:2017-03-25 17:13:54

标签: arrays ruby hash

我目前有一系列哈希:

total_order = [{"Hamburger"=>5.0}, {"Hamburger"=>5.0}, {"Hamburger"=>5.0}]

我试图遍历此数组中的每个哈希值,然后对所有值求和。所以基本上我想要返回15.0。

这是我目前的代码。我甚至都没有尝试总结它,只需返回每个值,以便我可以将其求和。当我运行它时,我只返回数组:

  def total_order_cost
    total_order.each do |item|
      item.map do |k, v|
        print v
      end
    end
  end

我知道如何迭代哈希值然后对值内的值求和?检查了其他人的问题,但似乎无法使我的案例中的任何解决方案都有效。我看到的其他答案没有解决我的问题,也没有包括使用flat_map等解决方案。

5 个答案:

答案 0 :(得分:3)

这是我提出的最简洁的方式:

2.1.2 :013 > [{a:1},{b:2}].map(&:values).flatten.inject(:+)
=> 3

values只返回值,而不是键,然后inject将它们全部加在一起。 inject is a great function,真正帮助我思考列表理解,这是有道理的。

答案 1 :(得分:2)

总结哈希的值:

{a:1,b:2}.values.sum
#=> 3

为你的哈希数组做到这一点:

total_order.flat_map(&:values).sum
#=> 15.0

请注意,sum仅适用于Ruby 2.4.0及更高版本(以及Rails中)。在旧版本中,您可以使用reduce(:+)inject(:+)代替sum

答案 2 :(得分:1)

您的方法返回total_oder.each的结果,而Array#each只返回self,因此您的方法只返回total_order。顺便提一下,each的所有实现都是如此,而不仅仅是Array;它是each的标准协议。 each仅用于阻止副作用。

如果您要转换 Enumerable,则需要使用Enumerable#map,它会使用给定的块转换每个元素。

因此,您希望获得Hash es中的所有值。查看the documentation of Hash并查看是否可以找到可能用于返回值的方法。怎么样Hash#values,这听起来不错,不是吗?

total_order.map(&:values)
#=> [[5.0], [5.0], [5.0]]

现在,我们希望摆脱额外的嵌套级别,我们可以使用Array#flatten,但最好确保嵌套不会出现在第一位,所以我们使用Enumerable#flat_map代替Enumerable#map

total_order.flat_map(&:values)
#=> [5.0, 5.0, 5.0]

好的,接下来你想要对这些值求和。再说一次,让我们看一下the documentation of Enumerable。什么可以调用Enumerable项的总和的方法。 Enumerable#sum如何发声?

total_order.flat_map(&:values).sum
#=> 15.0

你有你想要的结果。这个故事的寓意是:学习Enumerable中的方法,它们是Ruby编程的基础。并且,学习导航the documentation

答案 3 :(得分:0)

sum = 0
def total_order_cost
  total_order.each do |item|
    item.each do |k,v|
        sum = sum + v
     end
   p sum
end

答案 4 :(得分:0)

您的代码并不太远:

total_order = [{"Hamburger"=>5.0}, {"Hamburger"=>5.0}, {"Hamburger"=>5.0}]

def total_order_cost(order)
  cost = 0
  order.each do |item|
    item.each do |k, v|
      cost = cost + v
    end
  end
  return cost
end

puts total_order_cost(total_order) # 15.0