2

ハッシュの配列があり、それぞれに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

ポーク?

4

3 に答える 3

5

ですべてのハッシュ値を取得し、それらを合計するためにflat_map(&:values)使用できます。inject(:+)

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

あなたのアプローチが機能しない理由は、配列内の各ハッシュの各キーと値のペアではなく、注入が各ハッシュをブロックに生成するためです。ソリューションを維持したい場合は、次のようなものが必要です。

array.map {|hash| hash.inject(0) {|memo, (key, value)| memo + value } }.inject(:+)
于 2013-07-17T09:24:05.490 に答える
5

.injectドキュメントから

memo の初期値を明示的に指定しない場合、コレクションの最初の要素が memo の初期値として使用されます。

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

memo の値は数値ではなくハッシュです。

として修正します。

array.inject(0) {|memo, hash| memo + hash[:lol]} # => 3
于 2013-07-17T09:34:48.953 に答える
4

に引数を指定しない場合inject、最初の繰り返しのメモ オブジェクトの値は列挙可能な要素の最初の要素 (この場合はハッシュ) になります。したがって、次0のように引数として渡す必要がありinjectます。

array = [{lol: 1}, {lol: 2}]
array.inject(0) { |sum, h| sum + h[:lol] }
# => 3
于 2013-07-17T09:31:22.737 に答える