Using the data that you have, create a data structure that will help you build the table BEFORE actually building the table.
Suppose we have the following data
var data = [{
email_address: 'someone@able.com',
number_of_ordrs: 4,
total_order_value: 5.56
}, {
email_address: 'someone.else@bodge.com',
number_of_orders: 3,
total_order_value: 8.97
}, {
email_address: 'another@able.com',
number_of_orders: 6,
total_order_value: 0.93
}, {
email_address: 'someone@bodge.com',
number_of_orders: 6,
total_order_value: 0.93
}];
Let's transform it so that it looks like
var newData: {
'able.com': [{
email_address: 'someone@able.com',
number_of_orders: 4,
total_order_value: 5.56
}, {
email_address: 'another@able.com',
number_of_orders: 6,
total_order_value: 0.93
}],
'bodge.com': [{
email_address: 'someone.else@bodge.com',
number_of_orders: 3,
total_order_value: 8.97
}, {
email_address: 'someone@bodge.com',
number_of_orders: 6,
total_order_value: 0.93
}]
};
We'll also need another variable domains, an array, to store and sort the domains. In JavaScript, the order of the properties is not guaranteed, so iterating over the object would not be a good idea. Instead, we'll use domains to ensure the order.
$(function() {
var data = [{
email_address: 'someone@able.com',
number_of_orders: 4,
total_order_value: 5.56
}, {
email_address: 'someone.else@bodge.com',
number_of_orders: 3,
total_order_value: 8.97
}, {
email_address: 'another@able.com',
number_of_orders: 6,
total_order_value: 0.93
}, {
email_address: 'someone@bodge.com',
number_of_orders: 6,
total_order_value: 0.93
}];
var newData = {};
data.forEach(function(d) {
var domain = d.email_address.split('@')[1];
// is this a new domain?
if (!newData.hasOwnProperty(domain)) {
newData[domain] = [];
}
// add entry
newData[domain].push(d);
});
// get and sort domains alphabetically
var domains = Object.keys(newData).sort();
//console.log(domains, newData);
// build table
var html = '<table>';
domains.forEach(function(domain) {
html += '<tr><td colspan="3">' + domain + '</td></tr>';
newData[domain].forEach(function(entry) {
html += '<tr>';
html += '<td>' + entry.email_address + '</td>';
html += '<td>' + entry.number_of_orders + '</td>';
html += '<td>' + entry.total_order_value + '</td>';
html += '</tr>';
});
});
html += '</table>';
$('#Reports').html(html);
});
table {
border: 1px solid #000;
border-collapse: collapse;
}
td {
border: 1px solid #000;
padding: 5px;
text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="Reports"></div>