Example of usage:
const str = arrayToCsvString([{a: 1, b: 2}, {b: 3, c: 4}]);
console.log(str);Returns the string:
a,b,c
1,2,
,3,4
| /** | |
| * Transform an array of objects in javascript into a single csv string with the header as the first line | |
| * | |
| * Works on any javascript version above ES6 (2015) | |
| * | |
| * @param array {any[]} | |
| * @param columnDelimiter {string} | |
| * @param quoteChar {string} | |
| * @param newline {string} | |
| * @returns {string} | |
| */ | |
| function arrayToCsvString(array, columnDelimiter = ',', quoteChar = '"', newline = '\n') { | |
| const columnNameList = []; | |
| for (const obj of array) { | |
| if (typeof obj !== 'object') { | |
| continue; | |
| } | |
| for (const property in obj) { | |
| if (columnNameList.indexOf(property) === -1) { | |
| columnNameList.push(property); | |
| } | |
| } | |
| } | |
| function transformColumnValueToCsvColumn(value) { | |
| if (value === null || value === undefined) { | |
| return ''; | |
| } | |
| if (typeof value !== 'string') { | |
| value = value.toString(); | |
| } | |
| if (value.includes(columnDelimiter) || value.includes(quoteChar) || value.includes(newline)) { | |
| return quoteChar + value.split(quoteChar).join(quoteChar + quoteChar) + quoteChar; | |
| } | |
| return value; | |
| } | |
| const lines = [ | |
| columnNameList.map(columnName => transformColumnValueToCsvColumn(columnName)).join(columnDelimiter) | |
| ]; | |
| for (const obj of array) { | |
| if (typeof obj === 'object') { | |
| const line = []; | |
| for (const property of columnNameList) { | |
| line.push(transformColumnValueToCsvColumn(obj[property])); | |
| } | |
| lines.push(line.join(columnDelimiter)); | |
| } | |
| } | |
| return lines.join(newline); | |
| } | 
| /** | |
| * Transform a array of objects into a single csv string with the header as the first line | |
| * @param array | |
| * @param columnDelimiter | |
| * @param quoteChar | |
| * @param newline | |
| * @returns {string} | |
| */ | |
| function arrayToCsvString(array: any[], columnDelimiter = ',', quoteChar = '"', newline = '\n'): string { | |
| const columnNameList: string[] = []; | |
| for (const obj of array) { | |
| if (typeof obj !== 'object') { | |
| continue; | |
| } | |
| for (const property in obj) { | |
| if (!columnNameList.includes(property)) { | |
| columnNameList.push(property); | |
| } | |
| } | |
| } | |
| function transformColumnValueToCsvColumn(value: any) { | |
| if (value === null || value === undefined) { | |
| return ''; | |
| } | |
| if (typeof value !== 'string') { | |
| value = value.toString(); | |
| } | |
| if (value.includes(columnDelimiter) || value.includes(quoteChar) || value.includes(newline)) { | |
| return quoteChar + value.split(quoteChar).join(quoteChar + quoteChar) + quoteChar; | |
| } | |
| return value; | |
| } | |
| const lines: string[] = [ | |
| columnNameList.map(columnName => transformColumnValueToCsvColumn(columnName)).join(columnDelimiter) | |
| ]; | |
| for (const obj of array) { | |
| if (typeof obj === 'object') { | |
| const line = []; | |
| for (const property of columnNameList) { | |
| line.push(transformColumnValueToCsvColumn(obj[property])); | |
| } | |
| lines.push(line.join(columnDelimiter)); | |
| } | |
| } | |
| return lines.join(newline); | |
| } | 
Example of usage:
const str = arrayToCsvString([{a: 1, b: 2}, {b: 3, c: 4}]);
console.log(str);Returns the string:
a,b,c
1,2,
,3,4