UNPKG

excel-remastered

Version:

Enhances readability of complex nested JSON data while converting to CSV

123 lines (122 loc) 4.75 kB
"use strict"; 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;