使用带有哈希数组的注入

Bar*_*ira 2 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
Run Code Online (Sandbox Code Playgroud)

Por que?

Chr*_*ald 5

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

[{lol: 1}, {lol: 2}].flat_map(&:values).inject(:+)
Run Code Online (Sandbox Code Playgroud)

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

array.map {|hash| hash.inject(0) {|memo, (key, value)| memo + value } }.inject(:+)
Run Code Online (Sandbox Code Playgroud)


tor*_*o2k 5

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

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


Jes*_*ese 5

来自 .inject文档

如果没有显式指定memo的初始值,则集合的第一个元素将用作memo的初始值。

array.inject {|memo, (key, value)| memo + value}
Run Code Online (Sandbox Code Playgroud)

memo 的值是哈希值而不是数字。

将其更正为

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