(() => { const repeat = (char, length) => Array(length + 1).join(char); const ljust = (s, width, c = " ") => s.length < width ? s + repeat(c.slice(0, 1), width - s.length) : s; // padleft const rjust = (s, width, c = " ") => s.length < width ? repeat(c.slice(0, 1), width - s.length) + s : s; // padright function center(s, width, c = " ") { // padcenter if (s.length < width) { c = c.slice(0, 1); const len = width - s.length; const remain = (len % 2 === 0) ? "" : c; const pads = repeat(c, Math.floor(len / 2)); return pads + s + pads + remain; } else return s; } const ALIGN = { LEFT: 0, CENTER: 1, RIGHT: 2 }; const printTable = (data) => { if (!Array.isArray(data)) return; if (data.length < 1) return new Error("Table should contain at least 1 row"); const columns = []; const typeRow = data[1]; const columnCount = typeRow.length; for (let c = 0; c < columnCount; c++) { const column = { index: c, name: `Col ${c}`, size: 0, align: ALIGN.LEFT }; const type = typeof typeRow[c]; if (type === "number") { column.align = ALIGN.RIGHT; } column.size = data.reduce((v, r) => Math.max(v, String(r[c]).length), 0); columns.push(column); } const tabledata = []; for (const row of data) { const rowdata = []; for (const col of columns) { const value = String(row[col.index]); if (col.align == ALIGN.CENTER) { rowdata.push(center(value, col.size)) } else if (col.align == ALIGN.RIGHT) { rowdata.push(rjust(value, col.size)) } else { rowdata.push(ljust(value, col.size)); } } tabledata.push(`| ${rowdata.join(" | ")} |`); } const width = tabledata[0].length; const line = repeat("=", width); tabledata.splice(1, 0, line); tabledata.unshift(line); tabledata.push(line); return tabledata.join("\n"); } const objsToTable = (data) => { const result = []; const columns = Object.keys(data[0]); let row = []; for (const c of columns) { row.push(c); } result.push(row); for (const item of data) { row = []; for (const c of columns) { row.push(item[c]); } result.push(row); } return result; }; const data = [ {"id":1,"first_name":"Hogan","last_name":"Egdal","age":55,"email":"hegdal0@t-online.de","gender":"Female","ip_address":"246.182.212.226"}, {"id":2,"first_name":"Haily","last_name":"Cheales","age":56,"email":"hcheales1@mlb.com","gender":"Female","ip_address":"89.149.57.20"}, {"id":3,"first_name":"Mandel","last_name":"Calken","age":39,"email":"mcalken2@mozilla.com","gender":"Genderfluid","ip_address":"146.82.130.243"}, {"id":4,"first_name":"Meade","last_name":"Ongin","age":12,"email":"mongin3@technorati.com","gender":"Genderfluid","ip_address":"85.33.52.45"}, {"id":5,"first_name":"Jeannie","last_name":"Balazs","age":22,"email":"jbalazs4@tripod.com","gender":"Bigender","ip_address":"124.200.22.70"}, {"id":6,"first_name":"Leonie","last_name":"Mimmack","age":29,"email":"lmimmack5@chron.com","gender":"Genderfluid","ip_address":"140.108.128.252"}, {"id":7,"first_name":"Inglis","last_name":"Daspar","age":80,"email":"idaspar6@odnoklassniki.ru","gender":"Agender","ip_address":"172.50.192.149"}, {"id":8,"first_name":"Michal","last_name":"Itzik","age":41,"email":"mitzik7@pcworld.com","gender":"Genderqueer","ip_address":"164.224.49.132"}, {"id":9,"first_name":"Vikki","last_name":"Edelheit","age":20,"email":"vedelheit8@dagondesign.com","gender":"Polygender","ip_address":"112.172.252.190"}, {"id":10,"first_name":"Mallory","last_name":"Stamp","age":66,"email":"mstamp9@cnn.com","gender":"Genderfluid","ip_address":"51.223.32.46"} ]; const out = printTable(objsToTable(data)); console.log(out); })();
Result
================================================================================================== | id | first_name | last_name | age | email | gender | ip_address | ================================================================================================== | 1 | Hogan | Egdal | 55 | hegdal0@t-online.de | Female | 246.182.212.226 | | 2 | Haily | Cheales | 56 | hcheales1@mlb.com | Female | 89.149.57.20 | | 3 | Mandel | Calken | 39 | mcalken2@mozilla.com | Genderfluid | 146.82.130.243 | | 4 | Meade | Ongin | 12 | mongin3@technorati.com | Genderfluid | 85.33.52.45 | | 5 | Jeannie | Balazs | 22 | jbalazs4@tripod.com | Bigender | 124.200.22.70 | | 6 | Leonie | Mimmack | 29 | lmimmack5@chron.com | Genderfluid | 140.108.128.252 | | 7 | Inglis | Daspar | 80 | idaspar6@odnoklassniki.ru | Agender | 172.50.192.149 | | 8 | Michal | Itzik | 41 | mitzik7@pcworld.com | Genderqueer | 164.224.49.132 | | 9 | Vikki | Edelheit | 20 | vedelheit8@dagondesign.com | Polygender | 112.172.252.190 | | 10 | Mallory | Stamp | 66 | mstamp9@cnn.com | Genderfluid | 51.223.32.46 | ==================================================================================================
540410cookie-checkJavascript PrintTable