react-csv/src/core.js
Danieth 486589d967 Modified jsonsHeaders#jsons2arrays to work with falsy keys
* `header in object` should be a sufficient condition. The suggested
  `String(object[header])` wasn't passing the original tests - it caused
  keys that didn't exist on the object to be inserted as
  undefined. Checking if the key is in the object allows for falsy
  values, while preventing keys that haven't ever been set from leaking
  in.
* Should close issue #6
* https://github.com/abdennour/react-csv/issues/6
2017-03-12 15:17:52 -04:00

46 lines
1.6 KiB
JavaScript

export const isJsons = ((array) => Array.isArray(array) && array.every(
row => (typeof row === 'object' && !(row instanceof Array))
));
export const isArrays = ((array) => Array.isArray(array) && array.every(
row => Array.isArray(row)
));
export const jsonsHeaders = ((array) => Array.from(
array.map(json => Object.keys(json))
.reduce((a, b) => new Set([...a, ...b]), [])
));
export const jsons2arrays = (jsons, headers) => {
headers = headers || jsonsHeaders(jsons);
const data = jsons.map((object) => headers.map((header) => (header in object) ? object[header] : ''));
return [headers, ...data];
};
export const joiner = ((data,separator = ',') =>
data.map((row, index) => row.map((element) => "\"" + element + "\"").join(separator)).join(`\n`)
);
export const arrays2csv = ((data, headers, separator) =>
joiner(headers ? [headers, ...data] : data, separator)
);
export const jsons2csv = ((data, headers, separator) =>
joiner(jsons2arrays(data, headers), separator)
);
export const string2csv = ((data, headers, separator) =>
(headers) ? `${headers.join(separator)}\n${data}`: data
)
export const toCSV = (data, headers, separator) => {
if (isJsons(data)) return jsons2csv(data, headers, separator);
if (isArrays(data)) return arrays2csv(data, headers, separator);
if (typeof data ==='string') return string2csv(data, headers, separator);
throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `);
};
export const buildURI = ((data, headers, separator) => encodeURI(
`data:text/csv;charset=utf-8,${toCSV(data, headers, separator)}`
)
);