UNPKG

tableify

Version:

Create HTML tables from Javascript Objects

144 lines (115 loc) 4.33 kB
"use strict"; module.exports = init({ }); module.exports.defaults = init; function init(config) { var classes = config.classes === false ? false : true; var classPrefix = config.classPrefix || ""; return function tableify(obj, columns, parents) { var buf = []; var type = typeof obj; var cols; parents = parents || []; if (type !== 'object' || obj == null || obj == undefined) { } else if (~parents.indexOf(obj)) { return "[Circular]"; } else { parents.push(obj); } if (Array.isArray(obj)) { if (Array.isArray(obj[0]) && obj.every(Array.isArray)) { buf.push('<table>','<tbody>'); cols = []; // 2D array is an array of rows obj.forEach(function (row, ix) { cols.push(ix); buf.push('<tr>'); row.forEach(function (val) { buf.push('<td' + getClass(val) + '>', tableify(val, cols, parents), '</td>') }); buf.push('</tr>'); }); buf.push('</tbody>','</table>'); } else if (typeof obj[0] === 'object') { buf.push('<table>','<thead>','<tr>'); //loop through every object and get unique keys var keys = {}; obj.forEach(function (o) { if (typeof o === 'object' && !Array.isArray(o)) { Object.keys(o).forEach(function (k) { keys[k] = true; }); } }); cols = Object.keys(keys); cols.forEach(function (key) { buf.push('<th' + getClass(obj[0][key]) + '>', key, '</th>'); }); buf.push('</tr>', '</thead>', '<tbody>'); obj.forEach(function (record) { buf.push('<tr>'); buf.push(tableify(record, cols, parents)); buf.push('</tr>'); }); buf.push('</tbody></table>'); } else { buf.push('<table>','<tbody>'); cols = []; obj.forEach(function (val, ix) { cols.push(ix); buf.push('<tr>', '<td' + getClass(val) + '>', tableify(val, cols, parents), '</td>', '</tr>'); }); buf.push('</tbody>','</table>'); } } else if (obj && typeof obj === 'object' && !Array.isArray(obj) && !(obj instanceof Date)) { if (!columns) { buf.push('<table>'); Object.keys(obj).forEach(function (key) { buf.push('<tr>', '<th' + getClass(obj[key]) + '>', key, '</th>', '<td' + getClass(obj[key]) + '>', tableify(obj[key], false, parents), '</td>', '</tr>'); }); buf.push('</table>'); } else { columns.forEach(function (key) { if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) { buf.push('<td' + getClass(obj[key]) + '>', tableify(obj[key], false, parents), '</td>'); } else { buf.push('<td' + getClass(obj[key]) + '>', tableify(obj[key], columns, parents), '</td>'); } }); } } else { buf.push(obj); } if (type !== 'object' || obj == null || obj == undefined) { } else { parents.pop(obj); } return buf.join(''); } function getClass(obj) { if (!classes) { return ''; } return ' class="' + classPrefix + ((obj && obj.constructor && obj.constructor.name) ? obj.constructor.name : typeof obj || '' ).toLowerCase() + ((obj === null) ? ' null' : '' ) + '"' ; } }