FormData to Object
by Guido Belluomo
HTML
<html>
<body>
</body>
</html>
JavaScript
/**
* @param {FormData} formData
* @return {Object}
*/
function formDataToObject(formData) {
const object = {};
for (let pair of formData.entries()) {
const key = pair[0];
const value = pair[1];
const isArray = key.endsWith('[]');
const name = key.substring(0, key.length - (2 * isArray));
const path = name.replaceAll(']', '');
const pathParts = path.split('[');
const partialsCount = pathParts.length;
let iterationObject = object;
for (let i = 0; i < partialsCount; i++) {
let part = pathParts[i];
let iterationObjectElement = iterationObject[part];
if (i !== partialsCount - 1) {
if (!iterationObject.hasOwnProperty(part) || typeof iterationObjectElement !== "object") {
iterationObject[part] = {};
}
iterationObject = iterationObject[part];
} else {
if (isArray) {
if (!iterationObject.hasOwnProperty(part)) {
iterationObject[part] = [value];
} else {
iterationObjectElement.push(value);
}
} else {
iterationObject[part] = value;
}
}
}
}
return object;
}
const testFormData = new FormData();
testFormData.append('a', 1);
testFormData.append('b', 2);
testFormData.append('c', 3);
testFormData.append('d[]', 4);
testFormData.append('d[]', 5);
testFormData.append('d[]', 6);
testFormData.append('e[a]', 7);
testFormData.append('e[b]', 8);
testFormData.append('e[c]', 9);
testFormData.append('f[a][]', 10);
testFormData.append('f[a][]', 11);
testFormData.append('f[a][]', 12);
testFormData.append('f[a][]', 13);
testFormData.append('f[a][]', 14);
testFormData.append('g[a][]', 15);
testFormData.append('g[b][c][d][e]', 16);
testFormData.append('g[b][c][d][f][]',...