javascript - 如何发送带有对象数组(包括 FormData 中的文件)的嵌套对象?

标签 javascript ajax javascript-objects form-data

我有一个嵌套对象,其中一些值是对象数组。这些对象有一个字段作为文件。这是对象结构。

{
  "shop_name":"Organic Farm Shop",
  "shop_logo": File,
  "description":"Lorem ipsum dolor sit amet consectetur adipisicing elit. ",
  "category":"Grocery",
  "shop_url":"organic-farm",
  "product_details":[
    {
      "product_name":"Fresh Carrots",
      "product_image": File,
      "price":45,
      "stock":10,
      "unit":"Kg",
      "catogoryName":"Frozen Foodss"
    },
    {
      "product_name":"Fresh Cucumbers",
      "product_image": File,
      "price":80,
      "stock":20,
      "unit":"Kg",
      "catogoryName":"Frozen Foodss"
    }
  ],
  "page_input":[
    {
      "inputLabel":"Address",
      "inputType":"multiline_text"
    },
    {
      "inputLabel":"Mobile Number",
      "inputType":"numbers"
    }
  ]
}

如何将其附加到 FormData?或者有没有更好的方法来做到这一点而不使用 FormData?

最佳答案

您应该首先将其字符串化:

var expressiveObjectVariableName = JSON.stringify(expressiveObjectName);

然后正常附加它。

form.append('expressiveFieldName', expressiveObjectVariableName );

More info

编辑:

对于嵌套对象、数组和文件,所描述的问题,请尝试以下操作:

JavaScript 版本

function toFormData(obj, form, namespace) {
    let fd = form || new FormData();
    let formKey;
  
  for(let property in obj) {
    if(obj.hasOwnProperty(property) && obj[property]) {
      if (namespace) {
        formKey = namespace + '[' + property + ']';
      } else {
        formKey = property;
      }
     
      // if the property is an object, but not a File, use recursivity.
      if (obj[property] instanceof Date) {
        fd.append(formKey, obj[property].toISOString());
      }
      else if (typeof obj[property] === 'object' && !(obj[property] instanceof File)) {
        toFormData(obj[property], fd, formKey);
      } else { // if it's a string or a File object
        fd.append(formKey, obj[property]);
      }
    }
  }
  
  return fd;
}

TypeScript 版本

function createFormData(object: Object, form?: FormData, namespace?: string): FormData {
    const formData = form || new FormData();
    for (let property in object) {
        if (!object.hasOwnProperty(property) || !object[property]) {
            continue;
        }
        const formKey = namespace ? `${namespace}[${property}]` : property;
        if (object[property] instanceof Date) {
            formData.append(formKey, object[property].toISOString());
        } else if (typeof object[property] === 'object' && !(object[property] instanceof File)) {
            createFormData(object[property], formData, formKey);
        } else {
            formData.append(formKey, object[property]);
        }
    }
    return formData;
}

关于javascript - 如何发送带有对象数组(包括 FormData 中的文件)的嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67255881/

相关文章:

javascript - JSON.解析: unexpected end of data (javascript)

php - 向客户端发送 PHP 错误的正确机制

javascript - grails ajax文件上传:form

javascript - 为什么在维度变量中无法识别 .domain、tickFormat 和 tickValues? (d3,平行坐标)

javascript - 简单的 javascript search() 函数不起作用

javascript - $.ajax 无法正常工作

javascript - 使用箭头函数将数组缩减为对象

javascript - 调用 JavaScript 对象函数

javascript - React 不会在 map 函数中渲染

javascript - 将 freemarker 与 javascript ES6 模板字符串一起使用