web-dev-qa-db-ja.com

ruby)のハッシュの配列をフラット化します

次のような簡単なコードがあります。

fruit.each do |c|
  c.each do |key, value|
    puts value
  end
end

これは問題なく動作しますが、ルビーのようには感じません。私の目標は、この配列を取ることです。

[{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]

そしてそれをこれに変換します:

[ "1", "2", "3" ]

考え?

18
aronchick

Railsにある場合、または to_proc が定義されている場合は、@ toholioのソリューションよりも少し短くすることができます。

arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]
37
wombleton

したがって、各ハッシュをその値に変換してから、他のハッシュの値と結合する必要がありますか?

in = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = in.map{ |item| item.values }.flatten

out["1","2","3"]になります。

19
toholio

@wombleton @aronchickパフォーマンスを向上させるために、「map(&:values).flatten」の代わりに「flat_map(&:values)」を使用することをお勧めします。

arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.flat_map(&:values)

詳細については、こちらをご覧ください: http://gistflow.com/posts/578-use-flat_map-instead-of-map-flatten

13
dalpo

map!を使用する場合、メモリ内に別の配列を作成しません

a.map! {|h| h.values}.flatten

これは次のように書くこともできます

a.map!(&:values).flatten!

コメントも見ると、Ruby 1.9.3にflat_mapと呼ばれるメソッドがあります( http://Ruby-doc.org/core-1.9.3/ Enumerable.html#method-i-flat_map )これは、1回の呼び出しでマップとフラット化を実行します。

a.flat_map(&:values)
5
Orlando
a.inject([]) { |mem,obj| mem += obj.values }
4
Hemant Kumar

それほど変化はありませんが、mapを使用できます。

x.map do |fruit|
    fruit.each { |k,v| puts v }
end
0
Evan Meagher