diff --git a/lib/helpers/formDataToJSON.js b/lib/helpers/formDataToJSON.js index e8db891f..bc36d65b 100644 --- a/lib/helpers/formDataToJSON.js +++ b/lib/helpers/formDataToJSON.js @@ -58,7 +58,9 @@ function formDataToJSON(formData) { if (isLast) { if (utils.hasOwnProp(target, name)) { - target[name] = [target[name], value]; + target[name] = utils.isArray(target[name]) + ? target[name].concat(value) + : [target[name], value]; } else { target[name] = value; } diff --git a/tests/unit/helpers/formDataToJSON.test.js b/tests/unit/helpers/formDataToJSON.test.js index cffb6383..68ab0ab3 100644 --- a/tests/unit/helpers/formDataToJSON.test.js +++ b/tests/unit/helpers/formDataToJSON.test.js @@ -27,6 +27,32 @@ describe('formDataToJSON', () => { }); }); + it('should keep repeatable values flat for 3+ entries', () => { + const formData = new FormData(); + + formData.append('select3', '301'); + formData.append('select3', '302'); + formData.append('select3', '303'); + + expect(formDataToJSON(formData)).toEqual({ + select3: ['301', '302', '303'], + }); + }); + + it('should keep nested repeatable values flat for 3+ entries', () => { + const formData = new FormData(); + + formData.append('foo[bar]', '1'); + formData.append('foo[bar]', '2'); + formData.append('foo[bar]', '3'); + + expect(formDataToJSON(formData)).toEqual({ + foo: { + bar: ['1', '2', '3'], + }, + }); + }); + it('should convert props with empty brackets to arrays', () => { const formData = new FormData();