Generate an HTML table from an array of hashes in Ruby
# modified from Harish's answer, to take care of sparse hashes:require 'builder'def hasharray_to_html( hashArray ) # collect all hash keys, even if they don't appear in each hash: headers = hashArray.inject([]){|a,x| a |= x.keys ; a} # use array union to find all unique headers/keys html = Builder::XmlMarkup.new(:indent => 2) html.table { html.tr { headers.each{|h| html.th(h)} } hashArray.each do |row| html.tr { row.values.each { |value| html.td(value) }} end } return htmlend
Use the XMLBuilder for this:
data = [{"col1"=>"v1", "col2"=>"v2"}, {"col1"=>"v3", "col2"=>"v4"}]xm = Builder::XmlMarkup.new(:indent => 2)xm.table { xm.tr { data[0].keys.each { |key| xm.th(key)}} data.each { |row| xm.tr { row.values.each { |value| xm.td(value)}}}}puts "#{xm}"
Output
<table> <tr> <th>col1</th> <th>col2</th> </tr> <tr> <td>v1</td> <td>v2</td> </tr> <tr> <td>v3</td> <td>v4</td> </tr></table>
You can use builder
:
require 'builder'a = [{"col1"=>"v1", "col2"=>"v2"}, {"col1"=>"v3", "col2"=>"v4"}]builder = Builder::XmlMarkup.newcolumns = a.first.keysbuilder.table do |t| t.tr do |tr| columns.each do |col| tr.th(col) end end a.each do |row| t.tr do |tr| columns.each do |col| tr.td(row[col]) end end endendp builder.target#=> "<table><tr><th>col1</th><th>col2</th></tr><tr><td>v1</td><td>v2</td></tr><tr><td>v3</td><td>v4</td></tr></table><target/>"