2011-12-15 2 views
1

У меня есть массив хэшей, что я хочу, чтобы включить в таблицу, но сложная часть в том, что хэш-ключи не последовательны:Как создать таблицу из массива хэшей без согласованных клавиш?

a = [ 
    { 
    "name" => "Jack", 
    "phone" => "9542221234", 
    "state" => "FL" 
    }, 
    { 
     "name" => "John", 
     "job" => "Lawyer" 
    }, 
    { 
     "name" => "Mike", 
     "campaign" => "test", 
     "state" => "NY" 
    } 
] 

Я в недоумении о том, как в цикле по массиву, вытащите уникальное имя ключа и добавьте применимые значения в строки. Я пытаюсь добиться этого эффекта:

Name | Phone | State | Campaign | Job 
--------------------------------------------- 
Jack 9542221234 FL 
John         Lawyer 
Mike     NY  test 

Я искал решение и смотрел на различные драгоценные камни, такие как строитель, но каждый пример я нашел предполагает, что имена ключей являются последовательными и вытаскивает ключи заголовка таблицы из первый хэш в массиве.

+0

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

+0

Ключи сами по себе полностью динамичны, поэтому нет способа узнать, пока не будет создан массив хешей. По сути, это параметры URL, которые сохраняются в хэш-форме. Хотя в большинстве случаев они будут согласованы, в этом случае важно, чтобы они были чем угодно. – Ataraxy

ответ

2
cols = a.map(&:keys).flatten.uniq 
cols.each do |colname| 
    printf "%-10s ", colname 
end 
puts 
a.each do |row| 
    cols.each do |colname| 
    printf "%-10s ", row[colname] 
    end 
    puts 
end 
+1

Для этого вам необходимо сгладить массив 'cols':' cols = a.map (&: keys) .flatten.uniq'. Это первый раз, когда я вижу '&: keys' Где я могу найти дополнительную информацию об этом виде ярлыка? Учитывая, что карта обычно не принимает никаких аргументов. –

+1

IMHO 'puts"% -10s "% colname' будет более идиоматичным, чем версия' printf'. –

+1

thx Kassym! исправлено. Майкл, который поместит каждое colname в отдельную строку, и мы этого не хотим. –

Смежные вопросы