Skip to content

Instantly share code, notes, and snippets.

@jesusr
Created July 3, 2017 07:17
Show Gist options
  • Save jesusr/9d2c786b1b258fc9c69b4a4434b45f0f to your computer and use it in GitHub Desktop.
Save jesusr/9d2c786b1b258fc9c69b4a4434b45f0f to your computer and use it in GitHub Desktop.
Flatten & unflatten
function unflatten(data) {
if (Object(data) !== data || Array.isArray(data)) {
return data;
}
let regex = /\%?([^%\[\]]+)|\[(\d+)\]/g,
resultholder = {};
for (let p in data) {
if (data[p]) {
let cur = resultholder,
prop = '',
m;
/*jshint -W084*/
while (m = regex.exec(p)) {
cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
prop = m[2] || m[1];
}
cur[prop] = data[p];
}
}
return resultholder[''] || resultholder;
}
function flatten(data) {
let result = {};
function recurse(cur, prop) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
for (let i = 0, l = cur.length; i < l; i++) {
recurse(cur[i], prop + '[' + i + ']');
}
if (!cur.length) {
result[prop] = [];
}
} else {
let isEmpty = true;
for (let p in cur) {
if (cur[p]) {
isEmpty = false;
recurse(cur[p], prop ? prop + '%' + p : p);
}
}
if (isEmpty && prop) {
result[prop] = {};
}
}
}
recurse(data, '');
Object.keys(result).map((k) => {
if ((typeof result[k] === 'object') && (result[k] !== null)) {
delete result[k];
}
});
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment