2021-06-26 02:59:14
将 JavaScript 中的 FormData 转换为普通对象的核心技巧是使用 Object.fromEntries() 方法。该方法通过接收 FormData 的迭代键值对数组,生成一个属性可直接访问的普通对象,从而简化数据处理流程。以下是具体实现与注意事项:
转换方法与示例基础转换通过 Object.fromEntries(formData) 直接转换,表单字段的 name 属性成为对象键,值为对应键的值。
const formSubmit = (e) => { e.preventDefault(); const formData = new FormData(e.target); const dataObject = Object.fromEntries(formData); // 转换为普通对象 console.log(dataObject.firstName); // 直接访问属性};完整示例结合表单提交事件,展示转换后的对象如何用于后续操作(如发送到 API):
const formSubmit = (e) => { e.preventDefault(); const formData = new FormData(e.target); const dataObject = Object.fromEntries(formData); // 示例:发送到后端 API fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(dataObject) // 转换为 JSON 字符串 });};document.querySelector('form').addEventListener('submit', formSubmit);重复字段处理
问题:若表单存在同名字段(如多个复选框),Object.fromEntries() 仅保留最后一个值。
解决方案:需手动迭代 FormData,将同名字段值收集为数组:const dataObject = {};for (const [key, value] of formData) { if (dataObject[key] !== undefined) { dataObject[key] = [dataObject[key], value].flat(); // 合并为数组 } else { dataObject[key] = value; }}
数据类型转换
问题:FormData 所有值默认为字符串类型,即使输入数字或布尔值。
解决方案:转换后手动调整类型:const dataObject = Object.fromEntries(formData);dataObject.age = Number(dataObject.age); // 字符串转数字dataObject.isSubscribed = dataObject.isSubscribed === 'on'; // 复选框转布尔值
浏览器兼容性
支持情况:Chrome 73+、Firefox 63+、Safari 12.1+、Edge 79+ 等现代浏览器。
兼容方案:旧版浏览器需引入 Polyfill(如 core-js 或 babel-polyfill)。
直观访问:通过 object.property 替代 formData.get('property'),提升代码可读性。
无缝集成:转换后的对象可直接用于 JSON 序列化、API 请求或本地验证。
需要快速将表单数据转换为 JSON 格式发送到后端。
需对表单数据进行复杂处理(如过滤、映射或计算)。
Object.fromEntries() 是处理 FormData 的高效工具,通过简单转换即可获得属性可直接访问的普通对象。开发者需注意重复字段、数据类型及兼容性问题,并根据实际需求选择是否手动处理特殊情况。掌握此技巧可显著提升表单数据处理的效率与代码质量。