我目前有一系列哈希:
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等解决方案。
答案 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