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)); }