Updated download functions & added CSV serializer
This commit is contained in:
26
src/csv.ts
Normal file
26
src/csv.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import {dotNotation, flattenObj} from './objects.ts';
|
||||
|
||||
/**
|
||||
* Convert an object to a CSV string
|
||||
*
|
||||
* @param {any[]} target Array of objects to create CSV from
|
||||
* @param {boolean} flatten Should nested object be flattened or treated as values
|
||||
* @return {string} CSV string
|
||||
*/
|
||||
export function csv(target: any[], flatten=true) {
|
||||
const headers = target.reduce((acc, row) => {
|
||||
Object.keys(flatten ? flattenObj(row) : row)
|
||||
.forEach(key => { if(!acc.includes(key)) acc.push(key); });
|
||||
return acc;
|
||||
}, []);
|
||||
return [
|
||||
headers.join(','),
|
||||
...target.map(row => headers.map((h: string) => {
|
||||
const value = dotNotation<any>(row, h);
|
||||
const type = typeof value;
|
||||
if(type == 'string' && value.includes(',')) return `"${value}"`;
|
||||
if(type == 'object') return `"${JSON.stringify(value)}"`;
|
||||
return value;
|
||||
}).join(','))
|
||||
].join('\n');
|
||||
}
|
Reference in New Issue
Block a user