次のような簡単なコードがあります。
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" ]
考え?
Railsにある場合、または to_proc が定義されている場合は、@ toholioのソリューションよりも少し短くすることができます。
arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]
したがって、各ハッシュをその値に変換してから、他のハッシュの値と結合する必要がありますか?
in = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = in.map{ |item| item.values }.flatten
out
は["1","2","3"]
になります。
@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
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)
a.inject([]) { |mem,obj| mem += obj.values }
それほど変化はありませんが、map
を使用できます。
x.map do |fruit|
fruit.each { |k,v| puts v }
end