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][]',...