我有一个哈希数组,每个哈希都有一个键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?
答案 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