Skip to content

Instantly share code, notes, and snippets.

@Mds92
Last active July 15, 2020 09:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Mds92/091828ea857cc556db2ca0f991fee9f6 to your computer and use it in GitHub Desktop.
Save Mds92/091828ea857cc556db2ca0f991fee9f6 to your computer and use it in GitHub Desktop.
TypeScript Object to FormData, with support for nested objects, arrays and File objects.
static convertModelToFormData(model: any, form: FormData = null, namespace = ''): FormData {
let formData = form || new FormData();
for (let propertyName in model) {
if (!model.hasOwnProperty(propertyName) || model[propertyName] == undefined) continue;
let formKey = namespace ? `${namespace}[${propertyName}]` : propertyName;
if (model[propertyName] instanceof Date) {
formData.append(formKey, this.dateTimeToString(model[propertyName]));
}
else if (model[propertyName] instanceof Array) {
model[propertyName].forEach((element, index) => {
if (typeof element != 'object')
formData.append(`${formKey}[]`, element);
else {
const tempFormKey = `${formKey}[${index}]`;
this.convertModelToFormData(element, formData, tempFormKey);
}
});
}
else if (typeof model[propertyName] === 'object' && !(model[propertyName] instanceof File)) {
this.convertModelToFormData(model[propertyName], formData, formKey);
}
else {
formData.append(formKey, model[propertyName].toString());
}
}
return formData;
}
@jokernix
Copy link

jokernix commented Jul 16, 2018

if model[propertyName] is 0 or false, then result will not contain this field. I changed the check (!model[propertyName]) for the next function:

export function isEmpty(obj) {
  if (typeof obj === 'string' || obj === '') {
    return false;
  }
  if (typeof obj === 'number' || obj === 0) {
    return false;
  }
  if (typeof obj === 'boolean') {
    return false;
  }

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      return false;
    }
  }

  return true;
}

like isEmpty(model[propertyName])

@parker-mike
Copy link

First of all, namespace is a reserved keyword in TypeScript(HandBook and Microsoft/TypeScript@GitHub).
Also, it seems that you forgot to deal with File since the last else will append "[object File]" to the formData

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment