Свести массив хэшей в ruby - PullRequest
18 голосов
/ 24 июня 2009

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

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

Мысли

Ответы [ 6 ]

37 голосов
/ 24 июня 2009

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

arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]
19 голосов
/ 24 июня 2009

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

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

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

12 голосов
/ 19 января 2013

@ 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

5 голосов
/ 29 ноября 2011

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

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 ) это сделает карту и сплющит за один вызов.

a.flat_map(&:values)
4 голосов
/ 24 июня 2009
a.inject([]) { |mem,obj| mem += obj.values }
0 голосов
/ 24 июня 2009

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

x.map do |fruit|
    fruit.each { |k,v| puts v }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...