Skip to main content


TS JS Deno

Converts a comma-separated values (CSV) string to a 2D array of objects. The first row of the string is used as the title row.

Use Array.prototype.slice() and Array.prototype.indexOf('\n') and String.prototype.split(delimiter) to separate the first row (title row) into values. Use String.prototype.split('\n') to create a string for each row, then and String.prototype.split(delimiter) to separate the values in each row. Use Array.prototype.reduce() to create an object for each row's values, with the keys parsed from the title row. Omit the second argument, delimiter, to use a default delimiter of ,.

type StringMap<T = string> = { [key: string]: T };

const CSVToJSON = (data: string, delimiter = ",") => {
const titles: string[] = data.slice(0, data.indexOf("\n")).split(delimiter);
return data
.slice(data.indexOf("\n") + 1)
.map((v) => {
const values = v.split(delimiter);
return titles.reduce(
(obj, title, index) => ((obj[title] = values[index]), obj),
{} as StringMap
CSVToJSON("col1,col2\na,b\nc,d"); // [{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}];
CSVToJSON("col1;col2\na;b\nc;d", ";"); // [{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}];