Подтвердить что ты не робот

Сгладить массив хэшей в рубине

У меня есть простой код, который выглядит так:

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" ]

Мысли?

4b9b3361

Ответ 1

Если это в Rails или если у вас to_proc, вы можете пойти немного короче, чем решение @toholio:

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

Ответ 2

Итак, вы хотите, чтобы каждый хеш был преобразован в его значения, а затем связан со значениями других хэшей?

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

out будет тогда ["1","2","3"].

Ответ 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

Ответ 4

a.inject([]) { |mem,obj| mem += obj.values }

Ответ 5

если вы используете карту!, вы не создаете другой массив в памяти

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)

Ответ 6

Это не сильно изменилось, но вы могли бы использовать map:

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