Generate an HTML table from an array of hashes in Ruby Generate an HTML table from an array of hashes in Ruby ruby ruby

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