export function getFormData(form: HTMLFormElement) {
const isValidElement = (element: HTMLFormElement) => {
return element.name && element.value;
};
const isCheckbox = (element: HTMLInputElement) => element.type === 'checkbox';
const isMultiSelect = (element: HTMLSelectElement) => element.options && element.multiple;
const getSelectValues = (options: HTMLSelectElement) =>
[].reduce.call(
options,
(values: string, option: HTMLOptionElement) => {
return option.selected ? values.concat(option.value) : values;
},
[]
);
const formToJSON = (elements: HTMLFormControlsCollection) =>
[].reduce.call(
elements,
(data: any, element: any) => {
if (isValidElement(element)) {
if (isCheckbox(element)) {
data[element.name] = element.checked;
} else if (isMultiSelect(element)) {
data[element.name] = getSelectValues(element);
} else {
data[element.name] = element.value;
}
}
return data;
},
{}
);
const data = formToJSON(form.elements);
return JSON.parse(JSON.stringify(data));
}