excel-remastered
Version:
Enhances readability of complex nested JSON data while converting to CSV
123 lines (122 loc) • 4.75 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
function flattenAttributes(jsonObject, parentKey, separator) {
if (parentKey === void 0) { parentKey = ''; }
if (separator === void 0) { separator = '.'; }
var attributes = {};
var _loop_1 = function (key) {
if (jsonObject.hasOwnProperty(key)) {
var fullKey_1 = parentKey ? "".concat(parentKey).concat(separator).concat(key) : key;
if (Array.isArray(jsonObject[key])) {
jsonObject[key].forEach(function (item, index) {
if (typeof item === 'object' && item !== null) {
attributes = __assign(__assign({}, attributes), flattenAttributes(item, "".concat(fullKey_1, "[").concat(index, "]"), separator));
}
else {
attributes["".concat(fullKey_1, "[").concat(index, "]")] = null;
}
});
}
else if (typeof jsonObject[key] === 'object' &&
jsonObject[key] !== null) {
attributes = __assign(__assign({}, attributes), flattenAttributes(jsonObject[key], fullKey_1, separator));
}
else {
attributes[fullKey_1] = null;
}
}
};
for (var key in jsonObject) {
_loop_1(key);
}
return attributes;
}
function modifyAttributes(attributes) {
var modifiedAttributes = {};
for (var key in attributes) {
var modifiedKey = key.substring(key.indexOf('.') + 1); // Remove everything before the first "." [for attributes of type 10.name.firstname]
var finalKey = modifiedKey.replace(/\[\d+\]/g, ''); // Remove all occurrences of "[n]"
modifiedAttributes[finalKey] = attributes[key];
}
return modifiedAttributes;
}
function arrangeHeaders(attributes) {
var csvArray = [];
var levels = {};
Object.keys(attributes).forEach(function (attribute) {
var parts = attribute.split('.');
var currentLevel = levels;
parts.forEach(function (part, index) {
if (!currentLevel[part]) {
currentLevel[part] = {};
}
currentLevel = currentLevel[part];
if (!csvArray[index]) {
csvArray[index] = [];
}
var parentIndex = csvArray[index - 1]
? csvArray[index - 1].indexOf(parts[index - 1])
: -1;
var currentIndex = csvArray[index].length;
while (currentIndex < parentIndex) {
csvArray[index].push('');
currentIndex++;
}
csvArray[index].push(part);
});
});
return csvArray;
}
function removeDuplicatesInSubArrays(csvArray) {
var uniqueValuesFirstSubArray = new Set();
var _loop_2 = function (i) {
var uniqueValues = new Set();
csvArray[i].forEach(function (element, j) {
// Check for duplicates within the sub-array fragment and reset if necessary
if (element !== '' && csvArray[i - 1][j] !== '') {
if (uniqueValues.has(element)) {
csvArray[i][j] = '';
}
else {
uniqueValues.add(element);
}
}
});
};
// Process subsequent sub-arrays
for (var i = 1; i < csvArray.length; i++) {
_loop_2(i);
}
// Process the first sub-array
csvArray[0].forEach(function (element, j) {
if (j > 0) {
if (uniqueValuesFirstSubArray.has(element)) {
csvArray[0][j] = '';
}
else {
uniqueValuesFirstSubArray.add(element);
}
}
});
}
function getHeaders(jsonObject) {
var flattenedAttributes = flattenAttributes(jsonObject); // extract all attributes from the json object
var headers = modifyAttributes(flattenedAttributes); // get all unique headers as an array
var csvHeadersArray = arrangeHeaders(headers); // arrange them in the required formatting for csv
removeDuplicatesInSubArrays(csvHeadersArray);
// Extract keys from the headers object
var headersArray = Object.keys(headers);
return { csvHeadersArray: csvHeadersArray, headers: headersArray };
}
exports.default = getHeaders;
;