Dia 15: Tabla de regalos
Al Polo Norte ha llegado ChatGPT y el elfo Sam Elfman est谩 trabajando en una aplicaci贸n de administraci贸n de regalos y ni帽os.
Para mejorar la presentaci贸n, quiere crear una funci贸n drawTable que reciba un array de objetos y lo convierta en una tabla de texto.
La tabla dibujada debe representar los datos del objeto de la siguiente manera:
Tiene una cabecera con el nombre de la columna.
El nombre de la columna pone la primera letra en may煤scula.
Cada fila debe contener los valores de los objetos en el orden correspondiente.
Cada valor debe estar alineado a la izquierda.
Los campos dejan siempre un espacio a la izquierda.
Los campos dejan a la derecha el espacio necesario para alinear la caja.
Mira el ejemplo para ver c贸mo debes dibujar la tabla:
drawTable([
{ name: 'Alice', city: 'London' },
{ name: 'Bob', city: 'Paris' },
{ name: 'Charlie', city: 'New York' }
])
// +---------+-----------+
// | Name | City |
// +---------+-----------+
// | Alice | London |
// | Bob | Paris |
// | Charlie | New York |
// +---------+-----------+
drawTable([
{ gift: 'Doll', quantity: 10 },
{ gift: 'Book', quantity: 5 },
{ gift: 'Music CD', quantity: 1 }
])
// +----------+----------+
// | Gift | Quantity |
// +----------+----------+
// | Doll | 10 |
// | Book | 5 |
// | Music CD | 1 |
// +----------+----------+
Solution
function drawTable(data) {
const headers = Object.keys(data[0])
const columnWidths = headers.map(header =>
Math.max(header.length, ...data.map(row => String(row[header]).length))
)
const createLine = () =>
'+-' + columnWidths.map(width => '-'.repeat(width)).join('-+-') + '-+'
const createRow = rowData =>
'| ' + rowData.map((cell, i) => cell.padEnd(columnWidths[i], ' ')).join(' | ') + ' |'
const headerRow = createRow(headers.map(header => header.charAt(0).toUpperCase() + header.slice(1)))
const dataRows = data.map(row => createRow(headers.map(header => String(row[header]))))
return [
createLine(),
headerRow,
createLine(),
...dataRows,
createLine()
].join('\n')
}
console.log(drawTable([
{ name: 'Alice', city: 'London' },
{ name: 'Bob', city: 'Paris' },
{ name: 'Charlie', city: 'New York' }
]))
console.log(drawTable([
{ gift: 'Doll', quantity: 10 },
{ gift: 'Book', quantity: 5 },
{ gift: 'Music CD', quantity: 1 }
]))