Ответ 1
Если это в Rails или если у вас to_proc, вы можете пойти немного короче, чем решение @toholio:
arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]
У меня есть простой код, который выглядит так:
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 Я предлагаю использовать "flat_map (&: values)" вместо "map (&: values).flatten" для лучшей производительности.
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
a.inject([]) { |mem,obj| mem += obj.values }
если вы используете карту!, вы не создаете другой массив в памяти
a.map! {|h| h.values}.flatten
это также можно записать как
a.map!(&:values).flatten!
также смотря на комментарии, theres метод в ruby 1.9.3 называется flat_map
(http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map), который будет делать карту и сгладить за один вызов.
a.flat_map(&:values)
Это не сильно изменилось, но вы могли бы использовать map
:
x.map do |fruit|
fruit.each { |k,v| puts v }
end