使用带有哈希数组的注入

时间:2013-07-17 09:22:19

标签: ruby

我有一个哈希数组,每个哈希都有一个键lol,它有一个整数值。我想总结这些值,注入总是工作但现在我得到一个例外:

array = [{lol: 1}, {lol: 2}]
array.inject {|memo, (key, value)| memo + value} =>
NoMethodError: undefined method `+' for {:lol=>1}:Hash
from (irb):26:in `block in irb_binding'
from (irb):26:in `each'
from (irb):26:in `inject'
from (irb):26

Por que?

3 个答案:

答案 0 :(得分:5)

您可以使用flat_map(&:values)获取所有哈希值,然后使用inject(:+)对它们求和。

[{lol: 1}, {lol: 2}].flat_map(&:values).inject(:+)

你的方法不起作用的原因是inject会产生块的每个哈希值,而不是数组中每个哈希值的每个键/值对。如果你想保留你的解决方案,你需要这样的东西:

array.map {|hash| hash.inject(0) {|memo, (key, value)| memo + value } }.inject(:+)

答案 1 :(得分:4)

来自.inject documentation

  

如果没有明确指定备忘录的初始值,那么集合的第一个元素将用作备忘录的初始值。

array.inject {|memo, (key, value)| memo + value}

备忘录的值是哈希而不是数字。

将其更正为

array.inject(0) {|memo, hash| memo + hash[:lol]} # => 3

答案 2 :(得分:2)

如果没有为inject指定参数,则第一次迭代的memo对象的值是枚举的第一个元素,在这种情况下是一个哈希。因此,您只需将0作为参数传递给inject

array = [{lol: 1}, {lol: 2}]
array.inject(0) { |sum, h| sum + h[:lol] }
# => 3