Tengo un objeto JSON así que estoy tratando de producir un CSV desde
{ "football": { "count": 2109, "emailed": 0, "optin": 2109, }, "tennis": { "count": 61114, "emailed": 11111, "optin": 555, } }Sin embargo, los títulos de los campos tienen que ser diferentes
Lo que busco es esencialmente algo como esto
Sport, Total, Emails Sent, No Opt Ins, football, 2109, 0, 2109, tennis, 61114, 11111, 555Intenté usar paquetes pero parece que no puedo hacerlo funcionar, como tal, luego intenté hacerlo yo mismo
const fields = ['Sport', 'Total', 'Emails Sent', 'No Opt Ins'];Envolví mi JSON en una matriz para poder usar el mapa
try { const replacer = (key, value) => (value === null ? '' : value); const csv = [ fields.join(','), ...dataReduced.map((row) => fields.map((fieldName) => JSON.stringify(row[fieldName], replacer)).join(',')), ].join('\r\n'); console.log(csv); } catch (err) { console.error(err); }Obviamente, eso no funcionará porque los nombres de los campos no coinciden con los nombres de los objetos. ¿Cómo puedo producir una salida CSV de la forma descrita anteriormente?
Gracias
Dado que la fila es un objeto literal, es posible que las claves no estén necesariamente ordenadas, por lo que el map aquí no es suficiente, debería haber un asignador de columnas, algo como esto:
const row = { "football": { "count": 2109, "emailed": 0, "optin": 2109, }, "tennis": { "count": 61114, "emailed": 11111, "optin": 555, } }; const head = { football: {id: 0, name: 'Sport'}, count: {id: 1, name: 'Total'}, emailed: {id: 2, name: 'Emails Sent'}, optin: {id: 3, name: 'No Opt Ins'} }; const csv = [Object.values(head).sort((a, b) => a.id - b.id) .map(value => value.name).join()]; Object.entries(row).forEach(([key, value]) => { const line = [key]; Object.entries(value).forEach(([key, value]) => { line[head[key].id] = value; }); csv.push(line.join()); }); console.log(csv.join('\n'));